最近我一直在研究数据库事务和一篇文章引用如下
JPA 通过@Version 注释提供对行版本控制的自动支持。当您拥有带有@Version 注释字段或属性的实体时,将自动启用乐观锁定。
我的理解是使用不同的锁来维护数据库隔离级别策略,例如
- 未提交读:使用独占写锁实现
- 已提交读:使用共享读锁和排他写锁实现。
很快。因此,事务隔离是通过不同的锁定实现的,我猜是使用悲观锁定。
我的问题是,当一个字段被声明为 @Version 注释时,它是否会覆盖底层默认隔离级别并发生乐观锁定?
最近我一直在研究数据库事务和一篇文章引用如下
JPA 通过@Version 注释提供对行版本控制的自动支持。当您拥有带有@Version 注释字段或属性的实体时,将自动启用乐观锁定。
我的理解是使用不同的锁来维护数据库隔离级别策略,例如
很快。因此,事务隔离是通过不同的锁定实现的,我猜是使用悲观锁定。
我的问题是,当一个字段被声明为 @Version 注释时,它是否会覆盖底层默认隔离级别并发生乐观锁定?
不,它们是不同的东西。默认情况下,隔离级别配置为read-commited
在事务提交之前无法读取任何更改。
如果您决定通过 使用乐观锁定@Version
,则根本不会更改隔离级别,但假设您要使用read-commited
隔离级别,因为我认为使用它没有意义read-uncommited
或者read-serialized
当您使用乐观锁定时,但是您能够。
创建事务时定义隔离级别,通常指定事务的只读模式、隔离级别、传播模式和名称。
乐观锁由 ORM 基础设施控制,在持久化时照顾对象的正确数字版本。所以,它们是不同的东西。
希望能帮助到你!
不,您不能使用 JPA 的乐观锁定覆盖底层数据库的隔离级别。
如果你能以某种方式做到这一点,那么这样做就不好了。
大多数数据库默认采用READ_COMMITED隔离级别。
在READ_COMMITED隔离级别下考虑以下场景。
Product
实体尽管这种情况是微不足道的,但这类事情可能会发生在非平凡的情况下。
通过将乐观锁定与数据库的默认隔离级别一起使用,可以避免这种意外情况。
希望这可以帮助。