@Transactional本地事务

事务的传播行为:

  1. PROPAGATION_REQUIRED
    在A方法开启事务调用b方法, 假如b方法事务配置用的是PROPAGATION_REQUIRED 那么b方法就不会开启新的事务, 会使用A的事务, 假如b出错, 那么A也要回滚
  2. PROPAGATION_REQUIRES_NEW
    如果是c方法这种 ,使用PROPAGATION_REQUIRES_NEW来修饰@Transactional注解, 则在调用c方法后c的c方法会新创建一个事务, c方法出异常那么c回滚,A方法捕捉到c事务的异常后,可以选择回滚或者不会滚
  3. PROPAGATION_SUPPORTS
    假设当前在事务中。即以事务的形式执行。假设当前不在一个事务中,那么就以非事务的形式执行
  4. PROPAGATION_MANDATORY
    必须在一个事务中执行。也就是说,他仅仅能被一个父事务调用。否则,他就要抛出异常

本地事务失效问题

在一个类的内部, a,b,c三个方法都是加了@Transcational注解的方法, 在b和c上面还有一些事务的配置, 如果a直接调用b方法和c方法, 那么bc两个方法上面的事务配置会失效, 统一使用a事务的配置, 这是因为,@Transcational注解的事务是基于代理对象来实现的, 而直接调用,相当于在a的代理对象内调用了,绕过了b方法和c方法的代理对象, 代理对象是要在代理对象内实现对方法的增强, 而直接调动是没有增强的.

解决办法: 在a内部使用代理对象来调用b和c方法, 具体做法:
1.引入aspectj
2.加上@enableAspectjAutoProxy(exposeProxy=true)注解, 并且暴露代理对象
使用Aopcontext获取代理对象
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值