【发布时间】:2017-10-23 19:15:58
【问题描述】:
我正在使用 Spring 进行事务管理。我正在使用 @Transactional 在我的应用程序中实现 spring 事务。我的场景之一是,我的应用程序的两个实例读取特定表的所有记录。在读取和处理记录后,这些记录将被删除。但我的问题是,在一个实例完成读取之前,处理和删除其他实例再次读取这些记录。为了解决这个问题,我计划在事务中使用读锁,以便在第一个事务完成之前所有记录都被锁定。如何使用 Spring 声明性注释来实现这一点。任何帮助表示赞赏。我使用 DB2 作为我的数据库。 谢谢。
【问题讨论】:
-
如果要删除行,读锁是不够的。你用什么来访问数据库?存储库? Jdbc模板?
-
我将在读取和处理后删除单个事务中的行。但第二种情况是在那段时间阅读那些记录,这是我不想要的。可序列化隔离对我有帮助吗?
-
不是真的,你需要做
SELECT FOR UPDATE SKIP LOCKED DATA以获得良好的吞吐量并且两者都做一些实际的工作。 -
DEFAULT (spring-tx-isolation) 默认为“底层数据源”的隔离,配置这个或尝试(至少)
READ_COMMITTED...在你去SERIALIZABLE.. . -
不要使用可序列化,它对你没有任何好处。事务将不断回滚,您将浪费时间重做它们而不是处理行。
标签: java database spring transactions spring-transactions