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