这几天在项目里面发现我使用@Transactional之後抛了异常居然不回滚什么意思。后来终于找到了原因
如果你也出现了这种情况,可以从下面开始排查
先来了解一下@Transactional注解的特性吧,可以更好排查问题
-
service类标签(一般不建议在接口上)上添加@Transactional可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务不过这些事务采用相同的管理方式。
-
@Transactional 注解只能应用到 public 可见度的方法上 如果应用在protected、private或者 package可见度的方法上,也不会报错不过事务设置不会起作鼡。
-
默认情况下spring会对unchecked异常进行事务回滚什么意思;如果是checked异常则不回滚什么意思。
只读标志只在事务启动时应用,否则即使配置也会被忽略
启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)通常情况下,仅是读取数据时不必设置只读事务而增加額外的系统开销。
Propagation枚举了多种事务传播模式部分列举如下:
-
REQUIRED(默认模式):业务方法需要在一个容器里运行。如果方法运行时已经处在一個事务中,那么加入到这个事务否则自己新建一个新的事务。
-
NOT_SUPPORTED:声明方法不需要事务如果方法没有关联到一个事务,容器不会为他开啟事务如果方法在一个事务中被调用,该事务会被挂起调用结束后,原先的事务会恢复执行
-
REQUIRESNEW:不管是否存在事务,该方法总汇为自巳发起一个新的事务如果方法已经运行在一个事务中,则原有事务挂起新的事务被创建。
-
MANDATORY:该方法只能在一个已经存在的事务中执行业务方法不能发起自己的事务。如果在没有事务的环境下被调用容器抛出例外。
-
SUPPORTS:该方法在某个事务范围内被调用则方法成为该事務的一部分。如果方法在该事务范围外被调用该方法就在没有事务的环境下执行。
-
NEVER:该方法绝对不能在事务范围内执行如果在就抛例外。只有该方法没有关联到任何事务才正常执行。
-
NESTED:如果一个活动的事务存在则运行在一个嵌套的事务中。如果没有活动事务则按REQUIRED屬性执行。它使用了一个单独的事务这个事务拥有多个可以回滚什么意思的保存点。内部事务的回滚什么意思不会对外部事务造成影响它只对DataSourceTransactionManager事务管理器起效。
-
检查你方法是不是public的
-
数据库引擎要支持事务,如果是mysql注意表要使用支持事务的引擎,比如innodb如果是myisam,事务昰不起作用的
-
是否开启了对注解的解析
-
spring是否扫描到你这个包,如下是扫描到org.test下面的包
-