Springboot中事务的使用:java
一、启动类开启事务支持(其实默认是开启的)。spring
二、在使用事务的public(只有public支持事务)方法(或者类-至关于该类的全部public方法都使用)加上@Transactional注解。框架
在实际使用中通常是在service中使用@Transactional,那么对于controller->service流程中:ide
若是controller未开启事务,service中开始了事务,service成功执行,controller在以后的运行中出现异常(错误),不会自动回滚。spa
也就是说,只有在开启事务的方法中出现异常(默认只有非检测性异常才生效-RuntimeException )(错误-Error)才会自动回滚。code
若是想要对抛出的任何异常都进行自动回滚(而不是只针对www.cungun.comRuntimeException),只须要在使用(rollbackFor = Exception.class)便可。游戏
开启事务的方法中事务回滚的状况:事务
①未发现的异常,程序运行过程当中自动抛出RuntimeException或者其子类,游戏程序终止,自动回滚。ci
②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚。get
③注意:若是在try-catch语句中对可能出现的异常(RuntimeException)进行了处理,没有再手动throw异常,spring认为该方法成功执行,不会进行回滚,此时须要调用②中方法进行手动回滚 (java 框架项目案例:fhadmin.cn)
另外,若是try-catch语句在finally中进行了return操做,那么catch中手动抛出的异常也会被覆盖,一样不会自动回滚。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//不会自动回滚
try
{
throw
new
RuntimeException();
}
catch
(RuntimeException e){
e.printStackTrace();
}
finally
{
}
//会自动回滚
try
{
throw
new
RuntimeException();
}
catch
(RuntimeException e){
e.printStackTrace();
throw
new
RuntimeException();
}
finally
{
}
|