当具有@Version的实体注释字段或属性时,乐观锁如何自动启用?

时间:2015-12-23 06:17:49

标签: java mysql jpa optimistic-locking pessimistic-locking

最近我一直在研究数据库事务和一篇文章引用如下

JPA通过@Version注释提供行版本控制的自动支持。当您拥有@Version annotatted字段或属性的实体时,将自动启用乐观锁定。

我的理解是使用不同的锁(如

)维护数据库隔离级别策略
  1. 读取未提交:使用独占写锁实现
  2. 读取已提交:使用共享读锁和独占写锁实现。
  3. 等等。因此,事务隔离是通过不同的锁实现的,我猜是通过使用悲观锁定。

    我的问题是当一个字段被声明为@Version annotatted它是否覆盖了底层的默认隔离级别并且发生了乐观锁定?

2 个答案:

答案 0 :(得分:2)

不,他们是不同的东西。默认情况下,隔离级别配置为read-commited,因此在事务提交之前不能读取任何更改。

如果您决定通过@Version使用乐观锁定,则根本不会更改隔离级别,但假设您要使用read-commited隔离级别,因为我认为它没有在使用乐观锁定时使用read-uncommitedread-serialized的意义,但你可以。

在创建事务时定义隔离级别,通常指定只读模式,隔离级别,传播模式和事务名称。

乐观锁定由ORM基础架构控制,在持久化时处理对象的正确数字版本。所以,它们是不同的东西。

希望它有所帮助!

答案 1 :(得分:1)

不,您无法使用JPA的乐观锁定覆盖基础数据库的隔离级别

如果你能以某种方式做到这一点,那就做不到这一点。

大多数数据库都采用 READ_COMMITED 隔离级别作为默认值。

READ_COMMITED 隔离级别下考虑以下方案。

  • 两位经理加载Product实体
  • 他们两人决定提高价格然后保存。
  • 一个价格更新在另一个之前提交。
  • 所以一位经理的价格将被其他经理的价格所取代,经理们知道这一点。

尽管这种情况微不足道,但这些事情可能会在非平凡的情况下发生。

使用数据库的默认隔离级别乐观锁定可以避免这种意外情况。

希望这有帮助。