一、事务不生效
- 访问权限问题,private、default、protect事务不生效,public事务才生效,AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
- 方法用final修饰,aop代理类无法重写该方法,static修饰方法也无法通过动态代理变成事务方法
- 方法内部调用,在同一个类中直接内部调用,会导致事务失效。新加一个Service方法;在该Service类中注入自己;通过AopContext.currentProxy()
- 类未被spring管理
- 多线程调用,两个方法不在同一个线程中,获取数据库的连接不一样,从而是两个不同的事务
- 表不支持事务,在mysql5之前,默认的数据库引擎是myisam,不支持事务、行锁和外键
- 未开启事务,springboot项目,DataSourceTransactionManagerAutoConfiguration自动开启事务,spring项目在appicationContext.xml加如下:
<!-- 配置事务管理器 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 用切点把事务切进去 -->
<aop:config>
<aop:pointcut expression="execution(* com.angi.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>
二、事务不回滚
- 错误的传播特性,propagation支持7种传播特性:REQUIRED、SUPPORTS、MANDATORY、REQUIRED_NEW、NOT_SUPPORTED、NEVER NESTED
- 手动try…catch了异常,捕获异常没有手动抛出
- 手动抛了别的异常,默认情况只会回滚RuntimeException运行时异常和Error错误,对于普通的Exception不会回滚
- 自定义了回滚异常,一般设置rollbackFor=Exception
- 嵌套事务回滚多了