当带有@Version 注释字段或属性 的实体时,如何自动启用乐观锁?
How does when an entity with @Version annotatted field or property, optimistic lock enables automatically?
最近在研究数据库事务,引用一篇文章如下
JPA 通过@Version 提供行版本控制的自动支持annotation.When 你有带@Version 注释字段的实体或属性,乐观锁定将自动启用。
我的理解是数据库隔离级别策略是使用不同的锁维护的,例如
- 读未提交:使用独占写锁实现
- 读已提交:使用共享读锁和独占写锁实现。
等等。因此,事务隔离是通过不同的锁定实现的,我猜是通过使用悲观锁定实现的。
我的问题是,当一个字段被声明为带@Version 注释时,它是否会覆盖底层默认隔离级别并发生乐观锁定?
不,它们是不同的东西。默认情况下,隔离级别配置为 read-commited
,因此在事务提交之前无法读取更改。
如果您决定通过 @Version
使用乐观锁定,您根本不会更改隔离级别,但假定您要使用 read-commited
隔离级别,因为我认为当您使用乐观锁定时,使用 read-uncommited
或 read-serialized
没有任何意义,但您可以。
创建事务时定义隔离级别,通常指定只读模式、隔离级别、传播模式和事务名称。
乐观锁定由 ORM 基础结构控制,在持久化时处理对象的正确数字版本。所以,它们是不同的东西。
希望对您有所帮助!
不,您不能使用 JPA 的乐观锁定覆盖底层数据库的隔离级别。
如果你能以某种方式做到这一点,那么这样做就不好了。
大多数数据库默认采用READ_COMMITED隔离级别。
在 READ_COMMITED 隔离级别下考虑以下场景。
- 两个管理器加载一个
Product
实体
- 两人决定加价再存。
- 一个价格更新先于另一个提交。
- 因此一位经理的价格将被另一位经理的价格覆盖,而经理并不知道这一点。
虽然这个场景是微不足道的,但在非微不足道的场景中也可能发生这种事情。
可以通过使用 乐观锁定 和数据库的默认隔离级别来避免这种意外情况。
希望对您有所帮助。
最近在研究数据库事务,引用一篇文章如下
JPA 通过@Version 提供行版本控制的自动支持annotation.When 你有带@Version 注释字段的实体或属性,乐观锁定将自动启用。
我的理解是数据库隔离级别策略是使用不同的锁维护的,例如
- 读未提交:使用独占写锁实现
- 读已提交:使用共享读锁和独占写锁实现。
等等。因此,事务隔离是通过不同的锁定实现的,我猜是通过使用悲观锁定实现的。
我的问题是,当一个字段被声明为带@Version 注释时,它是否会覆盖底层默认隔离级别并发生乐观锁定?
不,它们是不同的东西。默认情况下,隔离级别配置为 read-commited
,因此在事务提交之前无法读取更改。
如果您决定通过 @Version
使用乐观锁定,您根本不会更改隔离级别,但假定您要使用 read-commited
隔离级别,因为我认为当您使用乐观锁定时,使用 read-uncommited
或 read-serialized
没有任何意义,但您可以。
创建事务时定义隔离级别,通常指定只读模式、隔离级别、传播模式和事务名称。
乐观锁定由 ORM 基础结构控制,在持久化时处理对象的正确数字版本。所以,它们是不同的东西。
希望对您有所帮助!
不,您不能使用 JPA 的乐观锁定覆盖底层数据库的隔离级别。
如果你能以某种方式做到这一点,那么这样做就不好了。
大多数数据库默认采用READ_COMMITED隔离级别。
在 READ_COMMITED 隔离级别下考虑以下场景。
- 两个管理器加载一个
Product
实体 - 两人决定加价再存。
- 一个价格更新先于另一个提交。
- 因此一位经理的价格将被另一位经理的价格覆盖,而经理并不知道这一点。
虽然这个场景是微不足道的,但在非微不足道的场景中也可能发生这种事情。
可以通过使用 乐观锁定 和数据库的默认隔离级别来避免这种意外情况。
希望对您有所帮助。