当两个线程更新同一个对象时,有人可以帮助我解决可能的hibernate异常吗?
ex:员工姓名“a”,年龄“30”,地址为“test” thread1尝试将“a”更新为“b”,thread2尝试将“a”更新为“c”
提前致谢, 卡锡尔
答案 0 :(得分:4)
如果您的对象是Hibernate实体,那么两个线程首先不应该引用同一个对象。
每个线程都有自己的Hibernate会话,每个会话都有自己的实体副本。如果您的实体中有一个用@Version
注释的字段,那么对于乐观锁定,其中一个线程将获得一个OptimisticLockException。否则,一切都会顺利,最后提交的线程将获胜。
答案 1 :(得分:2)
感谢您的回答,以下是观察和分析后的评论
我们也可以使用查询中的where子句进行条件更新,并使用executeUpdate()方法。例如:Hibernate - Query - executeUpdate()方法更新并返回更新的实体数。因此,如果executeUpdate()返回“零”,则表示该行已被另一个线程更新。 (没有例外)
使用@Version。 (OptimisticLockException)
使用行级数据库锁定。 (数据库例外)
使用同步。 (Java同步异常)