zoukankan      html  css  js  c++  java
  • spring事务传播行为的思考

    1.问题

    @TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)  
    public class ActivityPublishComposeTest extends BaseUnitTest {
        
        @Autowired
        private ActivityPublishCompose activityPublishCompose;
        
        @Test
        @Rollback
        public void testPublishActivityScheme() {
            long start = System.currentTimeMillis();
            Map<String, Object> map = activityPublishCompose.publishActivityScheme(25661L, "H1916", "unit test publish");
            System.out.println("cost:" + (System.currentTimeMillis()-start));
            assertNotNull(map);
            assertTrue(map.size() != 0);
        }
    }
        @Transactional(rollbackFor = Exception.class)
        public Map<String, Object> publishActivityScheme(Long activitySchemeId, String operator, String comment) {
            ActivitySchemeDTO schemeDTO = activityPublishService.selectAllActivitySchemeEditData4Publish(activitySchemeId, false);
          ...
      }

    内层方法上的事务提交会影响外层方法上的事务Rollback吗?

    2.思考与解决

      从运行结果看,Rollback生效,是外层事务Rollback同时会影响内层事务的提交吗?查询关于spring事务的资料,发现这个问题不是内外层事务提交回滚的问题,而是spring事务传播行为的问题。在这里我们使用的是spring的默认传播行为,即Propagation.REQUIRED

       @Transactional注解中定义了默认的传播行为,这个Propagation.REQUIRED会检查当前是否已经有事务了,没有才创建一个新事务,如果已经有事务了,就支持当前事务,所以说内外层是同一个事务,那么只有外层方法上的事务提交时,事务才会真正提交。

       修改内层方法上事务的传播行为成Propagation.REQUIRES_NEW,运行测试用例,发现事务被提交,外层方法上的Rollback不起作用。由此可知Propagation.REQUIRES_NEW是新生成一个事务,外层事务提交不能影响它。

    3.参考资料

    http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt216

  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/kiss31415926/p/6097530.html
Copyright © 2011-2022 走看看