首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当具有@Version注释字段或属性的实体如何自动启用乐观锁?

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

Stack Overflow用户
提问于 2015-12-23 06:17:48
回答 2查看 374关注 0票数 2

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

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-23 07:52:54

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

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

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

乐观锁定由ORM基础结构控制,在持久化时考虑对象的适当编号版本。所以,它们是不同的东西。

希望能帮上忙!

票数 3
EN

Stack Overflow用户

发布于 2015-12-23 09:57:07

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

如果你能做到这一点,那就没什么好处了。

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

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

  • 两个管理器加载一个Product实体
  • 他们两人都决定提高价格,然后节省下来。
  • 一个价格更新会在另一个价格更新之前提交。
  • 因此,一位经理的价格将从另一位经理的价格中被推翻,而经理们不知道这一点。

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

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

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34429744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档