Hibernate更新查询混淆

时间:2016-05-16 11:32:29

标签: java hibernate oracle-sqldeveloper hibernate-criteria

我正在运行具有多个线程的java应用程序,这些线程将从oracle数据库进行查询,如果条件满足则会更新行。但是很有可能多个线程获得一行的相同状态,然后多个线程尝试更新同一行。

让我们说如果状态是"接受"对于任何行,然后将其更新为" PROCESSING"状态,然后开始处理,但处理应该只由一个更新此记录的线程完成。

一种方法是查询数据库,如果状态为" ACCEPTED"然后更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式。

Hibernate更新方法返回类型为void。所以我无法找到行现在更新还是已经更新。在这种情况下,是否有任何选择更新或休眠中的任何锁定功能可以帮助我。

2 个答案:

答案 0 :(得分:0)

你可以通过@Version很好地利用乐观锁定。

请看下面的帖子:

Optimistic Locking by concrete (Java) example

答案 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

这样,更新将仅针对特定版本成功,并且所有并发更新将不更新任何内容。