Spring中NESTED和REQUIRED_NEW传播行为的区别

摘要:
将启动新事务。如果使用JTA TransactionManager,则需要访问JTATransactionManager。嵌套事务可以独立于当前事务提交或回滚。请注意,不同的制造商对这种通信行为的支持不同。您可以参考资源管理器的文档来确认它们是否支持嵌套事务。案例传播_需要_新案例服务单层方法@TransactionalpublicvoidmoneyTestREQUIRED_NEWOne(){log.info;//1.查询患者的基本信息列表TBICXX=basisDao.getTBICXX();//2.更新TBMZFYHZIntegerTBMZFYZCount=tbmzfyhzDao.updateByCMZH;log.info捕获{e.printStackTrace();}日志信息;}serviceTwo layer_NEWTwo()中的方法@TransactionalpublicvoidmoneyTestREQUIRED{log.info;//3.更新TBMZFYMXGHInteger=tbmzfymxghDao.updateByCMZH;log.info,int i=2/0;}根据测试层中的CMZH方法/***测试其传播行为*propagation_REQUIRED_NEW:*表示当前方法必须在其自己的事务中运行。

简介

PROPAGATION_REQUIRED_NEW:
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager。
PROPAGATION_NESTED:
表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务。
嵌套事务: 外事物异常,内事物回滚;内事物异常,外事物正常。

案例

PROPAGATION_REQUIRED_NEW案例

serviceOne层中方法

@Transactional(rollbackFor = Exception.class)
    public void  moneyTestREQUIRED_NEWOne(){
        log.info("moneyTestREQUIRED_NEWOne事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
        //1.查询病人基本信息
        List<TBICXX> tbicxx = basisDao.getTBICXX();
        //2.根据CMZH更新TBMZFYHZ
        Integer TBMZFYHZCount = tbmzfyhzDao.updateByCMZH("土登", "1903003643");
        log.info("更新TBMZFYHZ影响行数{}",TBMZFYHZCount);
        try {
            propagationBehaviorTwo.moneyTestREQUIRED_NEWTwo();
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("-------------事物虽然回滚了,但是逻辑继续执行------------");
    }

serviceTwo层中方法

@Transactional(rollbackFor = Exception.class,propagation= Propagation.REQUIRES_NEW)
    public void  moneyTestREQUIRED_NEWTwo(){
        log.info("moneyTestREQUIRED_NEWTwo事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
        //3.根据CMZH更新TBMZFYMXGH
        Integer integer = tbmzfymxghDao.updateByCMZH("土登", "2107000224");
        log.info("更新TBMZFYMXGH影响行数{}",integer);
        int i=2/0;
    }

Test层中方法

  /**
     *  测试其传播行为
     *   PROPAGATION_REQUIRED_NEW:
     *       表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
     *
     **/
    @Test
    public void testTransationalPropagationREQUIRED_NEW(){
        behaviorOne.moneyTestREQUIRED_NEWOne();
    }

运行前
image
运行后数据库数据
image
运行后控制台打印
image
结论
外事物和内事物是独立的事物,内事物异常回滚不影响外事物,外事物回滚不影响内事物。

PROPAGATION_NESTED案例

serviceOne层中方法

@Transactional(rollbackFor = Exception.class)
    public void  moneyTestNESTEDOne(){
        log.info("moneyTestNESTEDOne事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
        //1.查询病人基本信息
        List<TBICXX> tbicxx = basisDao.getTBICXX();
        //2.根据CMZH更新TBMZFYHZ
        Integer TBMZFYHZCount = tbmzfyhzDao.updateByCMZH("三筒", "1903003643");
        log.info("更新TBMZFYHZ影响行数{}",TBMZFYHZCount);
        try {
            propagationBehaviorTwo.moneyTestNESTEDTwo();
        } catch (Exception e) {
            // 为了避免 org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 该异常产生
            // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            e.printStackTrace();
        }
        int i=2/0;  //JJ句
        log.info("-------------事物虽然回滚了,但是逻辑继续执行------------");
    }

serviceTwo层中方法

@Transactional(rollbackFor = Exception.class,propagation= Propagation.NESTED)
    public void  moneyTestNESTEDTwo(){
        log.info("moneyTestNESTEDTwo事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
        //3.根据CMZH更新TBMZFYMXGH
        Integer integer = tbmzfymxghDao.updateByCMZH("三筒", "2107000224");
        log.info("更新TBMZFYMXGH影响行数{}",integer);
		int i=2/0;   //KK句
    }

运行前数据库数据
image
--------------KK句注释调运行结果,JJ句开启---------------
运行后数据库数据
image
运行后控制台打印
image
--------------JJ句注释调运行结果,KK句开启---------------
运行后数据库数据
image

运行后控制台打印
image
结论
嵌套事物: 运行的是同一个事物,外事物提交,内事物回滚是通过设置回滚点来实现,具体实现过程参考:
https://www.jianshu.com/p/2f79ee33c8ad

Gitee代码地址

https://gitee.com/zhuayng/foundation-study/tree/develop/SpringBootDemo/src/main/java/com/yxkj/springbootdemo/service/impl

免责声明:文章转载自《Spring中NESTED和REQUIRED_NEW传播行为的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇渐进式jpeg(progressive jpeg)图片及其相关Nginx基础06:location语法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hbase事务

原文:http://hbasefly.com/2017/07/26/transaction-2/ 1、关于hbase事务 HBase目前只支持行级事务; 可以保证行级数据的原子性、一致性、隔离性以及持久性,即通常所说的ACID特性。 为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。 2、hbase事务原子性 hbas...

MySQL数据库事务各隔离级别加锁情况--read committed &amp;amp;&amp;amp; MVCC(转)

本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理解。这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解。 前言 可以很负责人的跟大家说,MySQL 中的...

Sql Server 锁

1.NOLOCK(不加锁)此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”,等于 READ UNCOMMITTED事务隔离级别。 2.HOLDLOCK(保持锁)此选项被选中时,SQL Ser...

MySQL死锁

https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html 什么是mysql的死锁? A deadlock is a situation where different transactions are unable to proceed because each holds a lock t...

3--Redis事务 ;配置文件详解 ;数据持久化

目录 一、事务 1.Redis的事务 2. 监控watch 二、Redis.conf详解 1.配置文件unit单位对大小写不敏感 2.包含 3.网络 4.通用general 5.快照 6.SECURITY安全 7.限制clients 8.append only 模式 aof配置 三、数据持久化 1.Redis数据安全问题 2.快照持久化...

mysql的文件组成以及IO操作的流程

文件组成: 主要包括数据文件、索引文件、日志文件(undolog、redolog、binlog),其中undolog和redolog是innodb存储引擎所有。   IO流程: 1.InnoDB引擎使用的是 WAL 技术(write ahead log),执行事务的时候,写完内存和日志(undolog、redolog、binlog),事务就算完成了。  异...