在提交当前事务之前,Hibernate会检查行的版本,它应该发出一个SQL
我想知道Hibernate如何确保在选择该行和提交当前事务之间的时间段内,没有任何其他事务会更新该行并更改其版本号?Hibernate唯一可能做的事情似乎是使用悲观锁定对行版本进行选择,使用
如果我的想法是正确的:
select
语句来获取该行。假设在发出该 select
语句后,Hibernate发现该行版本未更改,因此应该继续提交事务。我想知道Hibernate如何确保在选择该行和提交当前事务之间的时间段内,没有任何其他事务会更新该行并更改其版本号?Hibernate唯一可能做的事情似乎是使用悲观锁定对行版本进行选择,使用
Select ... For Update
或具有锁定正在读取的行的隔离级别的事务。如果我的想法是正确的:
那么Hibernate乐观锁定实际上确实使用了悲观锁定作为其操作,尽管该悲观锁定的持续时间非常短,因为事务将立即在其后提交。
否则,在行版本检查和提交之间存在一个短时间间隔,可能会发生竞争条件。