Spring事务失效

一、事务不生效

  1. 访问权限问题,private、default、protect事务不生效,public事务才生效,AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
  2. 方法用final修饰,aop代理类无法重写该方法,static修饰方法也无法通过动态代理变成事务方法
  3. 方法内部调用,在同一个类中直接内部调用,会导致事务失效。新加一个Service方法;在该Service类中注入自己;通过AopContext.currentProxy()
  4. 类未被spring管理
  5. 多线程调用,两个方法不在同一个线程中,获取数据库的连接不一样,从而是两个不同的事务
  6. 表不支持事务,在mysql5之前,默认的数据库引擎是myisam,不支持事务、行锁和外键
  7. 未开启事务,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>

二、事务不回滚

  1. 错误的传播特性,propagation支持7种传播特性:REQUIRED、SUPPORTS、MANDATORY、REQUIRED_NEW、NOT_SUPPORTED、NEVER NESTED
  2. 手动try…catch了异常,捕获异常没有手动抛出
  3. 手动抛了别的异常,默认情况只会回滚RuntimeException运行时异常和Error错误,对于普通的Exception不会回滚
  4. 自定义了回滚异常,一般设置rollbackFor=Exception
  5. 嵌套事务回滚多了
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值