具有 "version" 字段的乐观锁与快照隔离级别
optimistic lock with a "version" field vs snapshot isolation level
我想知道这两个乐观锁解决方案的advantage/inconvenient是什么:
使用 "version" 字段并检测更新期间的变化(即使用
hibernate @Version 注解)
对事务使用快照隔离级别
如果我是正确的,这 2 个解决方案具有相同的行为:如果在事务期间更新了行,则会抛出错误
谢谢
这两个没有相同的行为。使用 hibernate 乐观并发,如果要写入的行在此期间被修改并修改回来是可以的。例如 +1
后跟 -1
。也可以修改 hibernate 不检查的列。
快照隔离检查所有列,不比较数据。任何写入,甚至是空写入,如 x = x
都算在内。
快照隔离还可以保证您获得读取的时间点快照。您没有说明您打算用于 (1) 的隔离级别。我假设它不是 SNAPSHOT。因此 (2) 可能会为您提供 hibernate 无法单独提供的保证。
Hibernate 乐观并发适用于分离实体。快照隔离无法做到这一点,因为它需要一个事务来包含您所做的所有操作。
请注意,这两种解决方案都不可序列化,因为它们验证写入但不验证读取。
我想知道这两个乐观锁解决方案的advantage/inconvenient是什么:
使用 "version" 字段并检测更新期间的变化(即使用 hibernate @Version 注解)
对事务使用快照隔离级别
如果我是正确的,这 2 个解决方案具有相同的行为:如果在事务期间更新了行,则会抛出错误
谢谢
这两个没有相同的行为。使用 hibernate 乐观并发,如果要写入的行在此期间被修改并修改回来是可以的。例如 +1
后跟 -1
。也可以修改 hibernate 不检查的列。
快照隔离检查所有列,不比较数据。任何写入,甚至是空写入,如 x = x
都算在内。
快照隔离还可以保证您获得读取的时间点快照。您没有说明您打算用于 (1) 的隔离级别。我假设它不是 SNAPSHOT。因此 (2) 可能会为您提供 hibernate 无法单独提供的保证。
Hibernate 乐观并发适用于分离实体。快照隔离无法做到这一点,因为它需要一个事务来包含您所做的所有操作。
请注意,这两种解决方案都不可序列化,因为它们验证写入但不验证读取。