Spring关于事务的那些事儿

Spring关于事务的那些事儿

我们通常使用spring控制事务于service层。使用@Transactional注解。

注意:

  1. 在service方法里面如果对异常进行了捕获(try catch)的话,该事务是不会进行回滚的。
  2. 默认spring事务只在发生未被捕获的 RuntimeExcetpion时才回滚。

Spring Aop异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样Aop代理才能捕获到方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeException的异常,但可以通过配置来捕获特定的异常并回滚。

  • 解决方案A:换句话说在service的方法中使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被Aop捕获进而回滚。并且在controller层要继续捕获这个异常并处理
  • 解决方案B:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常
  • 解决方案C:如果要让所有Exception都回滚,在@Transactional(rollbackFor = Exception.class) 上加个参数就好了。

在此顺便补充关于异常的一些知识:

  1. Java中的所有不正常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类;
  2. 其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;
  3. Exception类,也就是通常所说的“异常”。主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)
  4. RuntimeException异常主要包括以下四种异常(其实还有很多其他异常,这里不一一列出):空指针异常、数组下标越界异常、类型转换异常、算术异常。RuntimeException异常会由java虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
  5. 检查异常,引起该异常的原因多种多样,比如说文件不存在、或者是连接错误等等。跟它的“兄弟”RuntimeException运行异常不同,该异常我们必须手动在代码里添加捕获语句来处理该异常,这也是我们学习java异常语句中主要处理的异常对象。

猜你喜欢

转载自blog.csdn.net/admin_mvip/article/details/82977633