Java Hibernate更新查询混淆
我用多个线程运行java应用程序,这些线程将从oracle数据库查询,若条件满足,它将更新行。但多个线程很有可能获得同一行的相同状态,然后多个线程尝试更新同一行 假设任何一行的状态为“已接受”,则将其更新为“正在处理”状态,然后开始处理,但处理只应由更新此记录的一个线程完成 一种方法是查询数据库,若状态为“已接受”,则更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式Java Hibernate更新查询混淆,java,hibernate,oracle-sqldeveloper,hibernate-criteria,Java,Hibernate,Oracle Sqldeveloper,Hibernate Criteria,我用多个线程运行java应用程序,这些线程将从oracle数据库查询,若条件满足,它将更新行。但多个线程很有可能获得同一行的相同状态,然后多个线程尝试更新同一行 假设任何一行的状态为“已接受”,则将其更新为“正在处理”状态,然后开始处理,但处理只应由更新此记录的一个线程完成 一种方法是查询数据库,若状态为“已接受”,则更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式 Hibernate更新方法返回类型为void。所以我无法找到行是现在更新了还是已经更新了
Hibernate更新方法返回类型为void。所以我无法找到行是现在更新了还是已经更新了。在这种情况下,hibernate中是否有任何更新选择或锁定功能可以帮助我。您可以通过@Version很好地使用乐观锁定 请看下面的帖子:
您可以通过@Version很好地利用乐观锁定 请看下面的帖子:
我认为你的问题与 除此之外,我还想在@shankarsh提供的答案上说,如果您想使用查询而不是entitymanager或hibernate会话,则需要在查询中包含version字段,如下所示:
update t.columntoUpdate,version = version + 1 from yourEntity where yourcondition and version = :version
这样,更新只会在特定版本中成功,而所有并发更新都不会更新任何内容。我认为您的问题与 除此之外,我还想在@shankarsh提供的答案上说,如果您想使用查询而不是entitymanager或hibernate会话,则需要在查询中包含version字段,如下所示:
update t.columntoUpdate,version = version + 1 from yourEntity where yourcondition and version = :version
这样,更新只会在特定版本中成功,而所有并发更新都不会更新任何内容