zoukankan      html  css  js  c++  java
  • Spring中NESTED和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

    XFS
  • 相关阅读:
    MS SQL2000 && 2005转出数据字典
    基于角色的访问控制'的权限管理的数据库的设计实现
    ANSI SQL / T SQL / PLSQL
    MS SQL系統資料表內容
    关闭不需要服务 为Windows系统提速
    Form.Enctype屬性
    流程圖
    ASPSmartUpload祥解
    数据排序常见算法(JS版)
    如何实现定时开机
  • 原文地址:https://www.cnblogs.com/xiaofengshan/p/15516720.html
Copyright © 2011-2022 走看看