@Transactional事务不生效的原因

1.@Transactional事务不生效的原因:

 Spring事务是通过AOP实现的,所以拥有事务功能的是,接口的代理类,而非接口本身。这样在调用@Transactional标注的方法时,要区分调用方法的入口是,代理类,还是,非代理类(如接口实现类自身)

如下:

@Service("tranService")
public class TranServiceImpl implements TranService{
    @Autowired
    private TransMapper transMapper;
    
    @Transactional
    public void test1(Long code){
        transMapper.test1Insert(code);
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void test2(String id){
        transMapper.test2Insert(id);
        int i = 1/0;
    }
    
    @Transactional
    public void test3(Long code, String id){
        test1(code);
        test2(id);
    }
}
//模拟调用Spring事务的方法
@Component("demo")
public class Demo {
    private static Long code = 1L;
    private static String id = "2";
    @Autowired
    private TranService tranService;//代理类
    
    public void doDemo1(){
        tranService.test1(code);//事务有效
    }
    public void doDemo2(){
        tranService.test2(id);//事务有效
    }
    public void doDemo3(){
        tranService.test3(code, id);//调用方法中只有test3一个事务,12属于自调用,没有事务切面
    }
    @Transactional
    public void doDemo4(){//共有三个事务,doDemo4test1test2,由于事务传播行为的设置,test1的事务,会合并到doDemo事务中;test2的事务是独立的,test2的回滚,不会影响doDemo4的事务;
        tranService.test1(code);
        tranService.test2(id);
    }
}

 

2.spring 事务特性

事务的隔离级别:是指若干个并发的事务之间的隔离程度

1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
2. @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化

事务传播行为:如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为

1. TransactionDefinition.PROPAGATION_REQUIRED:   如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:   创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3. TransactionDefinition.PROPAGATION_SUPPORTS:   如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:   以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5. TransactionDefinition.PROPAGATION_NEVER:   以非事务方式运行,如果当前存在事务,则抛出异常。
6. TransactionDefinition.PROPAGATION_MANDATORY:   如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7. TransactionDefinition.PROPAGATION_NESTED:   如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;   如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED

 

 

posted @   howard4  阅读(2296)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示