我想知道这两种乐观锁解决方案有什么优点/不方便之处:
使用“版本”字段并在更新期间检测更改(即使用休眠@Version 注释)
对事务使用快照隔离级别
如果我是正确的,这两个解决方案具有相同的行为:如果在事务期间更新了行,则会引发错误
谢谢
我想知道这两种乐观锁解决方案有什么优点/不方便之处:
使用“版本”字段并在更新期间检测更改(即使用休眠@Version 注释)
对事务使用快照隔离级别
如果我是正确的,这两个解决方案具有相同的行为:如果在事务期间更新了行,则会引发错误
谢谢
这两个没有相同的行为。使用休眠乐观并发,如果要写入的行同时被修改并被修改回来是可以的。例如 a+1
后跟 a -1
。列已被修改,hibernate 不检查也是可以的。
快照隔离检查所有列并且不比较数据。任何写入,甚至是空写入,例如x = x
计数。
快照隔离还可以保证您获得读取的时间点快照。你没有说你打算使用什么隔离级别(1)。我认为这不是快照。出于这个原因,(2) 可能会为您提供 hibernate 无法自行提供的保证。
Hibernate 乐观并发适用于分离的实体。快照隔离无法做到这一点,因为它需要一个事务来包含您所做的所有操作。
请注意,这两种解决方案都不可序列化,因为它们验证写入但不验证读取。