2

我想知道这两种乐观锁解决方案有什么优点/不方便之处:

  1. 使用“版本”字段并在更新期间检测更改(即使用休眠@Version 注释)

  2. 对事务使用快照隔离级别

如果我是正确的,这两个解决方案具有相同的行为:如果在事务期间更新了行,则会引发错误

谢谢

4

1 回答 1

3

这两个没有相同的行为。使用休眠乐观并发,如果要写入的行同时被修改并被修改回来是可以的。例如 a+1后跟 a -1。列已被修改,hibernate 不检查也是可以的。

快照隔离检查所有列并且不比较数据。任何写入,甚至是空写入,例如x = x计数。

快照隔离还可以保证您获得读取的时间点快照。你没有说你打算使用什么隔离级别(1)。我认为这不是快照。出于这个原因,(2) 可能会为您提供 hibernate 无法自行提供的保证。

Hibernate 乐观并发适用于分离的实体。快照隔离无法做到这一点,因为它需要一个事务来包含您所做的所有操作。

请注意,这两种解决方案都不可序列化,因为它们验证写入但不验证读取。

于 2015-02-17T13:10:13.187 回答