我正在运行具有多个线程的java应用程序,这些线程将从oracle数据库进行查询,如果条件满足则会更新行。但是很有可能多个线程获得一行的相同状态,然后多个线程尝试更新同一行。
让我们说如果状态是"接受"对于任何行,然后将其更新为" PROCESSING"状态,然后开始处理,但处理应该只由一个更新此记录的线程完成。
一种方法是查询数据库,如果状态为" ACCEPTED"然后更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式。
Hibernate更新方法返回类型为void。所以我无法找到行现在更新还是已经更新。在这种情况下,是否有任何选择更新或休眠中的任何锁定功能可以帮助我。
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为您的问题与How to properly handle two threads updating the same row in a database
有关在此之上,我想在@shankarsh提供的答案之上说,如果您要使用查询而不是entitymanager或休眠会话,则需要在查询中包括以下版本字段:>
update Table1
set Table1.Name=[release].[People].[Details].Name
from Table1 inner join [release].[People].[Details] on Table1.AccountNumber =[release].[People].[Details].AccountNumber
and Table1.AccountNumber COLLATE DATABASE_DEFAULT =[release].[People].[Details].AccountNumber COLLATE DATABASE_DEFAULT
这样,更新将仅针对特定版本成功,并且所有并发更新将不更新任何内容。