资讯专栏INFORMATION COLUMN

嵌套事务及事务不起作用的问题

Blackjun / 1062人阅读

摘要:否则事务不起作用。第二种情况同一个类中方法嵌套方法方法有,方法内都没有,事务起作用。总结要想事务起作用,必须是主方法名上有注解,方法体内不能用如果用,则中必须用注解应该只被应用到方法上,不要用在等方法上,即使用了也将被忽略,不起作用。

代码方法示例
    @Transactional
    public void saveAA() {
            try {
                //方法A第一次更新数据
            mapper.save();
            //调用方法B更新数据
            this.saveBB();
            } catch (Exception e) {
            throw new RuntimeException();
            }   
    }
    @Transactional
    public void saveBB(){
        try {
            //方法B第一次更新数据
            mapper.save();
                        
            int i = 100/0;
            //方法B第二次更新数据
            mapper.save();  
        } catch (Exception e) {
            //e.printStackTrace();
            throw new RuntimeException();
        }
    }

说明:

 

让事务起作用,遇到错误进行回滚,应该注意的事项:

第一种情况:同一个类中 一个方法无嵌套方法

 1、如果方法名上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则事务不起作用。

第二种情况:同一个类中 方法A嵌套方法B

1、方法A有@Transactional,方法内都没有try catch,事务起作用。

2、方法A有@Transactional和try catch,并且catch中用throw new RuntimeException(),事务起作用。

第三种情况:不同类中,方法C嵌套方法B

1、方法B上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则方法B的事务不起作用。

2、方法C上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException(),此时方法B怎么写都行。否则方法C的事务不起作用。

 

总结

1、要想事务起作用,必须是主方法名上有@Transactional注解,方法体内不能用try catch;如果用try catch,则catch中必须用throw new RuntimeException();

2、@Transactional注解应该只被应用到public方法上,不要用在protected、private等方法上,即使用了也将被忽略,不起作用。这是由Spring AOP决定的。

3、只有来自外部的方法调用才会呗AOP代理捕捉,类内部方法调用类内部的其他方法,子方法并会不引起事务行为,即使被调用的方法上使用有@Transactional注解。

4、类内部方法调用内部的其他方法,被调用的方法体中如果有try catch,则catch中必须用throw new RuntimeException(),否则即使主方法上加上@Transactional注解,如果被调用的子方法出错也不会抛出异常,不会引起事务起作用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74166.html

相关文章

  • Spring事务整理

    摘要:使用需要使用作为事务管理器。两个事务互不影响。这是默认的隔离级别,使用数据库默认的事务隔离级别下边的四个与的隔离级别相对应这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种事务隔离级别可 Spring事务整理 工作了几年了,今天抽时间整理一下spring的事务,说起spring的事务是面试的时候面试官经常提及的问题,接下来结合网上资料再总结下spring的事务...

    stackvoid 评论0 收藏0
  • 可能是最漂亮Spring事务管理详解

    摘要:事务隔离级别定义了一个事务可能受其他并发事务影响的程度我们先来看一下并发事务带来的问题,然后再来介绍一下接口中定义了五个表示隔离级别的常量。 Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,...

    邹立鹏 评论0 收藏0
  • @Transactional回滚问题(try catch、嵌套

    摘要:事务嵌套影响首先经过实验,结论一仍然成立,即,当不加上的时候,无论内外报,都会回滚无论内外报非错误,都不会回滚。结论结论一对于可以保证错误的回滚,如果想保证非错误的回滚,需要加上参数。 Spring 事务注解 @Transactional 本来可以保证原子性,如果事务内有报错的话,整个事务可以保证回滚,但是加上try catch或者事务嵌套,可能会导致事务回滚失败。测试一波。 准备 建...

    jone5679 评论0 收藏0
  • 关于MySQL知识点与面试常见问题都在这里

    摘要:但是这将严重影响程序的性能。垂直分区的优点在于可以使得行数据变小,在查询时减少读取的数,减少次数。此外,垂直分区可以简化表的结构,易于维护。垂直分区的缺点在于主键会出现冗余,需要管理冗余列,并会引起操作,可以通过在应用层进行来解决。 Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Jav...

    LeoHsiun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<