关于什么是嵌套事务的关系,我们用下面三个例子能够进行演示。
- 第一种情况:如果查不到数据,则说明在调用者无事务情况下,被调用者会新起一个事务
- 第二种情况:如果查不到数据,说明外层事务能够影响内层事务
- 第三种情况:如果查到数据,说明内层事务不影响外层事务
接下来我们编写具体的代码
- // NESTED传播属性-回滚事务
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED)
- public void testNestedHasException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_HAS_EXCEPTION+"')");
- // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- throw new RollbackException();
- }
- // NESTED传播属性-不回滚事务
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED)
- public void testNestedNoException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_NO_EXCEPTION+"')");
- }
然后接下来的调用者也会有点区别
- @Override
- @Transactional()
- public void hasTransactionalNoException() throws RollbackException {
- // NESTED传播属性 - 调用者有事务,不抛异常 被调用者有异常
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_HAS_EXCEPTION_TWO+"')");
- fooService.testNestedHasException();
- }
然后执行效果
- 2019-10-16 18:01:06.387 INFO 17172 --- [ main] c.e.t.t.TransactionApplication : 第一种情况 0
- 2019-10-16 18:01:06.389 INFO 17172 --- [ main] c.e.t.t.TransactionApplication : 第二种情况 0
- 2019-10-16 18:01:06.390 INFO 17172 --- [ main] c.e.t.t.TransactionApplication : 第三种情况 1
可以看出来嵌套事务的本质就是外层会影响内层,内层不影响外层。而REQUIRES_NEW则是互不影响。
总结
到现在我们已经全部分析完了七种传播属性,从写这篇文章开始到结束其中也碰到过一些坑,有些是不自己实践一遍是根本不知道的,所以我还是建议读者看完这篇文章以后自己进行实践,演示各种情况,只有这样才能够烂熟于心。
【编辑推荐】
- 微服务的数据库设计
- 超详细的SQL Server数据库触发器总结
- 公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼
- 华为云数据库助力锦江都城释放数据价值,驱动业务变革
- MySQL实验之不同字符集数据库迁移步骤演示
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|