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

How does when an entity with @Version annotatted field or property, optimistic lock enables automatically?

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

JPA 通过@Version 提供行版本控制的自动支持annotation.When 你有带@Version 注释字段的实体或属性,乐观锁定将自动启用。

我的理解是数据库隔离级别策略是使用不同的锁维护的,例如

  1. 读未提交:使用独占写锁实现
  2. 读已提交:使用共享读锁和独占写锁实现。

等等。因此,事务隔离是通过不同的锁定实现的,我猜是通过使用悲观锁定实现的。

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

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

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

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

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

希望对您有所帮助!

不,您不能使用 JPA 的乐观锁定覆盖底层数据库的隔离级别

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

大多数数据库默认采用READ_COMMITED隔离级别。

READ_COMMITED 隔离级别下考虑以下场景。

  • 两个管理器加载一个 Product 实体
  • 两人决定加价再存。
  • 一个价格更新先于另一个提交。
  • 因此一位经理的价格将被另一位经理的价格覆盖,而经理并不知道这一点。

虽然这个场景是微不足道的,但在非微不足道的场景中也可能发生这种事情。

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

希望对您有所帮助。