繁体   English   中英

Spring Service中并发更新,其中isolation = REPEATABLE_READ

[英]Concurrent updates in Spring Service with isolation=REPEATABLE_READ

我有一个在事务内部执行并更新一些表的Service方法。 在默认隔离级别,并发更新相互覆盖。 我不希望发生这种情况,因此我正在考虑切换到REPEATABLE_READ。 这样,我知道我将在可能的情况下(使用PostgreSQL这样)从数据库驱动程序中引发异常。

春季最有效的处理方式是什么? 我似乎没有内置任何功能,这让我有些惊讶,但是也许我是在错误地看待问题。

就我而言,我试图找到第一行“可用”进行更新。 我想避免两个并发事务更新同一行,但是我都希望两者最终更新一行。 不明智的计划是在Service方法周围进行一次try / catch,并重试X次,直到更新完成(找到要更新的行或确定没有要更新的行)。 感觉很手工/笨拙。

一种解决方案是使用隔离级别的序列化事务。 当线程B在线程A启动事务之后在线程B修改同一记录并在线程A提交之前提交时,线程A可能引发异常。 我不了解Spring,所以不知道您是否必须自己编写一个重试机制,或者Spring是否为您这样做。

另一种解决方案是使用默认隔离级别(已提交读)。 在表中添加“ modification_count”列。 读取记录时,您会记住记录的修改计数。 更新记录时,请确保增加修改计数,并且仅在修改计数与读取记录时具有相同的值时才进行更新。 因此,当您读取modification_count = 15的记录时,请确保更新如下所示:

update TABLE_NAME set value=1234, modification_count=16 where id=1234567 and modification_count=15

检查更新的行数。 如果更新了一行,则一切正常。 如果删除了零行,则与此同时另一个线程已更新记录。 在这种情况下,您必须重试交易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM