Spring 嵌套事务提交时机对其他查询操作的影响分析

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 嵌套事务提交时机对其他查询操作的影响分析相关的知识,希望对你有一定的参考价值。

背景

Spring 的 @Transactional 注解可以轻松实现数据库操作的事务控制,本文介绍上周遇到的一个嵌套事务的问题,探讨嵌套事务的提交时机对后续操作的影响。

服务调用链上的事务使用

一个调用链上,方法 A 调用了方法 B ,方法 A 和 B 中同时存在数据库操作,大概伪代码如下:

public void A() 
  1、数据库查询
  2、数据库插入
  3、调用方法 B
  4、B(); // 另一个类的方法
  5、 数据库查询:查询方法 B 插入的数据
  6、 数据库操作:删除方法 B 插入的数据


public void B 

这里讨论事务注解添加的位置,对操作步骤5 和 6 的影响。

情况一:只在 A 上加事务,所有操作在同一个事务中,操作步骤5 和 6 的数据依赖 4 的数据,而且数据是一致的。@Transactional 注解标注的流程中,所有 DAO 的操作在同一个事务中,对于 Propagation.REQUIRES_NEW 的事务来说,前面的数据库写操作,对后面的读操作是可见的。

情况二:A 和 B 上都有事务,步骤4调用 B 方法后向某表插入了数据,5 再查询查不到,但是 6 删除时有删除记录,说明 B 方法的事务的提交是在写操作时提交的。此时,要想让 步骤 5 立即读取到方法 B 插入的数据,可以修改 SQL 加上 for update 强制提交。

情况三:B 上没用事务注解,而是用 TransactionTemplate 手动提交插入操作,那么后面操作数据也能保持一致。

启示录

之所以在方法 B 上添加新事务,是为了不让方法 B 的操作受到方法 A 的异常的影响,但是如果二者数据有查询依赖的话,查询操作不会带来 B 事务的提交,所以造成数据不一致问题。

以上是关于Spring 嵌套事务提交时机对其他查询操作的影响分析的主要内容,如果未能解决你的问题,请参考以下文章

知识点:Spring嵌套事务方式

jdbcTemplate必须使用spring事务吗 否则不能提交

Spring嵌套事务原理

Spring中的事务操作

事务的隔离级别和传播级别有何区别

Spring的事务管理