2

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

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

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

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

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

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

4

2 回答 2

3

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

如果您决定通过 使用乐观锁定@Version,则根本不会更改隔离级别,但假设您要使用read-commited隔离级别,因为我认为使用它没有意义read-uncommited或者read-serialized当您使用乐观锁定时,但是您能够。

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

乐观锁由 ORM 基础设施控制,在持久化时照顾对象的正确数字版本。所以,它们是不同的东西。

希望能帮助到你!

于 2015-12-23T07:52:54.807 回答
2

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

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

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

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

  • 两个 Manager 加载一个Product实体
  • 他们俩都决定提高价格然后保存。
  • 一个价格更新在另一个之前提交。
  • 因此,一位经理的价格将被另一位经理的价格覆盖,而经理并不知道这一点。

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

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

希望这可以帮助。

于 2015-12-23T09:57:07.453 回答