事物不生效总结

1. 类内部调用同一个类中其它的public方法,这种情况事务是不生效的; 在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。

2. private  protected方法;

3. mysql存储引擎必须是InnoDB, 或者其它支持事务的存储引擎,MyIsam是不支持事务的;

4. 确保事务和业务在同一个线程里面;

     在一个事务方法A里面,业务逻辑另外起一个线程,那么这个线程是不受方法A事务控制的;

.....


@Transactional
public void methodB() {

     
    Runnable r = new Runnable() {
         
          
    }
    r.start();

}

     在一个非事务方法里面,调用相同类下面事务方法B, 那么方法B事务也不会生效; 

.....

public void methodA() {
    methodB();
}


@Transactional
public void methodB() {
   .....
}

.....

5. 方法内部catch住了异常,也会导致事务不回滚;

6. 方法用final修饰;

疑问:

如何获取代理类

java异常(Exception, error, throwable):

非检查异常(RuntimeException派生的类)  编译时不需要检查

检查异常   编译时需要检查  (检查异常事物要生效: rollBackFor=Exception.class)

Exception分类:

运行时异常  

非运行时异常

事物传播行为, 用propagation参数.

该参数的作用是指定事务的传播特性,spring目前支持7种传播特性:

REQUIRED 如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。
SUPPORTS 如果当前上下文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行。
MANDATORY 如果当前上下文中存在事务,否则抛出异常。
REQUIRES_NEW 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。
NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法在没有事务的环境中执行。
NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码。
NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。
 

参考:

常见Spring事务失效原理解析_spring声明式事务失效-CSDN博客

Spring事务@Transactional注解rollbackFor属性注意事项_@transactional(rollbackfor =-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值