两个线程更新同一个对象时可能出现的hibernate异常?

时间:2012-11-14 06:57:22

标签: hibernate hibernate-mapping

当两个线程更新同一个对象时,有人可以帮助我解决可能的hibernate异常吗?

ex:员工姓名“a”,年龄“30”,地址为“test”     thread1尝试将“a”更新为“b”,thread2尝试将“a”更新为“c”

提前致谢, 卡锡尔

2 个答案:

答案 0 :(得分:4)

如果您的对象是Hibernate实体,那么两个线程首先不应该引用同一个对象。

每个线程都有自己的Hibernate会话,每个会话都有自己的实体副本。如果您的实体中有一个用@Version注释的字段,那么对于乐观锁定,其中一个线程将获得一个OptimisticLockException。否则,一切都会顺利,最后提交的线程将获胜。

答案 1 :(得分:2)

感谢您的回答,以下是观察和分析后的评论

  1. 我们也可以使用查询中的where子句进行条件更新,并使用executeUpdate()方法。例如:Hibernate - Query - executeUpdate()方法更新并返回更新的实体数。因此,如果executeUpdate()返回“零”,则表示该行已被另一个线程更新。 (没有例外)

  2. 使用@Version。 (OptimisticLockException)

  3. 使用行级数据库锁定。 (数据库例外)

  4. 使用同步。 (Java同步异常)