
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
Spring事务是大多数Java程序员在学习软件开发技术的时候都需要熟练掌握的一个编程知识点,而本文我们就同案例分析来简单了解一下,Spring事务加入与嵌套的区别。
1.加入事务
加入事务REQUIRED是Spring事务的默认传播级别。
所谓的加入当前事务,是指如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。我们这里重点要讨论的是前一种情况,也就是当前存在事务的情况下,它和嵌套事务的区别,当我们设置了加入事务的事务传播机制之后,程序的执行结果是将用户表和日志表的事务都回滚了。
2.嵌套事务
嵌套事务指的是事务传播级别中的NESTED,所谓的嵌套当前事务,是指如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED。当然,我们本文要研究的重点也是一种情况,也就是当前存在事务的前提下,嵌套事务和加入事务的区别。
当设置嵌套事务的事务传播级别之后,程序执行了部分事务的回滚,用户表添加的事务没有回滚,只是日志表的事务回滚了。
3.加入事务VS嵌套事务
加入事务(REQUIRED)和嵌套事务(NESTED)都是事务传播机制的两种传播级别,如果当前不存在事务,那么二者的行为是一样的;但如果当前存在事务,那么加入事务的事务传播级别在遇到异常之后,会将事务全部回滚;而嵌套事务在遇到异常时,只是执行了部分事务的回滚。
4.嵌套事务实现原理
事务全部回滚很好理解,这本来就是事务原子性的一种体现,而嵌套事务中的部分事务回滚是怎么实现的呢?
嵌套事务只所以能实现部分事务的回滚,是因为在数据库中存在一个保存点(savepoint)的概念,以MySQL为例,嵌套事务相当于新建了一个保存点,而滚回时只回滚到当前保存点,因此之前的事务是不受影响的,而REQUIRED是加入到当前事务中,并没有创建事务的保存点,因此出现了回滚就是整个事务回滚,这就是嵌套事务和加入事务的区别。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。