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