spring事物问题,在一个方法里需要更新某张表的数据并使用最新的这个数据,使用事物注解应该如何写?
spring事物问题,在一个方法里需要更新某张表的数据并使用最新的这个数据,使用事物注解应该如何写?
//A方法的propagation为REQUIRED
public void A(){
//调用B方法更新,B方法的propagation为REQUIRES_NEW
B();
//调用C方法使用最新数据,C方法的propagation为REQUIRES_NEW
C();
}
试一下行不行
4 回答1.8k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
4 回答2.4k 阅读
2 回答847 阅读✓ 已解决
2 回答1.4k 阅读
这应该是数据库事物隔离级别的问题,数据库默认的隔离级别是
可重复读
, 也就是说事物内的操作在本事物中是可见的,但是在提交之前,该操作不对其他事物产生影响,其他事物看不见这个操作。数据库的四种隔离级别,下面用
mysql
数据库演示一下:READ UNCOMMITTED
未提交读,事务中的修改,即使没有提交,对其他事务也都是可见的,事物1的更新操作在未提交时,事物2是可见的。这种隔离级别下可能会有脏读、不可重复读、幻读等情况。READ COMMITTED
(已提交读/不可重复读):事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。还是上面的例子,事物1的更新操作在提交前,事物2是看不到的,提交之后才能看到。这种隔离级别下可能会有不可重复读、幻读等情况。
REPEATABLE READ
(可重复读):同一事务中多次读取同样的记录结果是一致的,MySQL默认的隔离级别。这种隔离级别下可能会有幻读情况。SERIALIZABLE
(序列化):事务串行执行,读写加锁。以上四种隔离级别体现了事物之间的相互影响程度。但是在同一个事物中,它的更新操作都是对本身可见的。不存在在同一个事物中,上面更新了,下面看不到的情况。除非你在使用spring事物的传播特性时,在事物中又开启了另外一个事物,导致在两个事物中,一个事物的更新另外一个事物看不到。
补充:
我用
SpringBoot
写了一个例子,在事物传播属性和隔离级别的影响下,有可能出现前面的更新,后面看不到的情况,下面是代码,注意看注释内容。SpringBoot pom.xml
文件加入以下依赖:主类:
事物1:
事物2:
输出:
完整代码放在github