问题标签 [optimistic-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4426 浏览

hibernate - 交易期间版本未增加

我有以下情况:

  1. 交易开始
  2. person.getVersion() --> 返回 0
  3. person.setName("脏");
  4. session.save(人);
  5. person.getVersion() --> 返回 0
  6. session.flush()
  7. person.getVersion() --> 返回 1
  8. 事务提交

在不实际强制会话刷新或事务提交的情况下,我该怎么做才能在步骤 4 中获取更新版本?

谢谢!

0 投票
2 回答
20694 浏览

hibernate - Hibernate 中默认的乐观锁定

我有一个关于 Hibernate 中的乐观锁定的问题。我正在尝试深入了解 Hibernate 的乐观锁定,但我有一个疑问。Hibernate 使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用 @Version 注释(或 xml 配置)并创建版本属性。另一个选项是使用optimistic-lock="all" 属性在不进行版本控制的情况下进行配置。

我的问题是,如果您没有定义任何版本控制属性并且您没有指定乐观锁属性,那么在这种情况下哪种策略使用 Hibernate?悲观锁定我很确定不是,所以我认为这是乐观锁定,但不知道如何。

非常感谢您的关注。

0 投票
1 回答
4653 浏览

java - JPA:读锁是如何工作的?

我试图了解调用 EntityManager.lock(entity, LockModeType.READ) 的效果。API 文档对我来说听起来很混乱。

如果我必须并发线程并且线程 1 调用 lock(entity, LockModeType.READ),线程 2 仍然可以读写实体吗?

到目前为止我学到了什么:

JPA1 中的锁类型 READ 与 JPA2 中的 OPTIMISTIC 相同。如果设置了这样的锁,EntityManager 在提交事务之前检查版本属性,但不会更新它。我找到了对 OPTIMIISTIC 锁定模式的解释:Link。搜索 OPTIMIISTIC (READ) LockMode 示例。据我了解,在线程 1 中设置读锁对线程 2 ... n 没有影响。所有其他线程仍然可以读取和写入实体。但是当线程 1 中的事务提交并且另一个线程更新了实体时,线程 1 中的事务被回滚。

我理解正确吗?

0 投票
2 回答
2787 浏览

java - 休眠。乐观锁。选择版本,即使它生成它

我有一个实体:

如果实体被保存多少次,在事务结束时Hibernate 选择对象的版本。为什么?Hibernate 在存储对象时会生成这个版本,所以它知道它。我发现这个方法调用了这个:

Hibernate 在日志中生成:

我使用 MySQL 和 Session#save()。

0 投票
1 回答
7592 浏览

spring - HibernateOptimisticLockingFailureException 将连接标记为“关闭”?

我得到以下堆栈跟踪:

这是由于乐观锁定异常。我可以解决这个问题的根本原因。

我的问题是 - 在这种情况下 - 异常处理将数据库连接设置为“关闭”。(这会导致我的连接池出现问题)。

处理数据库异常的模式是什么,比如HibernateOptimisticLockingFailureException通过 spring 和 hibernate 冒泡并返回一个关闭的连接?

您知道 Spring/Hibernate 代码中将连接设置为关闭的部分吗?

0 投票
3 回答
1773 浏览

sql-server - 在 SQL Server 2005 和 2008 中,如何判断我使用的是悲观并发模型还是乐观并发模型?

我知道 SQL Server 2000 有一个悲观的并发模型。而乐观模型是在SQL Server 2005 中添加的。那么我如何判断我是在使用悲观并发模型还是在SQL Server 2005 和2008 中使用乐观模型呢?

谢谢。

0 投票
1 回答
3571 浏览

grails - Grails:是什么确保版本检查和更新是原子的?

Grails 中的update操作首先检查要更新的对象的版本,然后更新它。在检查版本和更新对象期间,Grails 的哪一部分确保对象不会被另一个请求更新?

更新:

是的,hibernate 会在保存对象时检查版本,如果乐观锁定失败,则会抛出异常。而且我想hibernate会确保检查+更新是原子的,但是......

如果您查看 grails 生成的更新方法,您会发现 grails 首先进行了仔细检查,然后(从我的角度来看)并没有准备好处理异常。在更新方法已经检查了正确的版本之后,hibernate 抛出异常的可能性很小,但对我来说似乎是可能的。

那么尝试保存并捕获异常(如果有的话)还不够吗?

0 投票
1 回答
547 浏览

hibernate - 如何应用 @InitBinder 来保护 Spring MVC、Hibernate 应用程序中的 @Version 字段?

在带有 Hibernate 4.1 的 Spring 3.1 MVC 应用程序中,我正在使用:

  • 声明式事务管理
  • 每个请求的会话
  • 通过在域对象中添加“版本”属性进行乐观锁定
  • 使用 saveOrUpdate() 重新附加分离的域对象

域对象在 GET 请求期间作为命令对象发送,以便用户更新。

为了不出现错误“乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)”,我在每个 jsp 页面中都包含“ <form:hidden path="version"/>”并且更新工作正常。

为了进一步保护应用程序,我正在尝试向控制器添加以下内容:

但是当我这样做时,我得到错误乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)”。

有人可以解释一下我正在尝试做的事情作为一种方法是否有效以及我做错了什么?

我相信理想情况下,我应该尝试保护域对象的主键以及可能未被特定 jsp 页面修改的某些字段。

先感谢您。

0 投票
1 回答
1091 浏览

java - 如何用 hibernate-jpa2.0 抛出 OptimisticLockException

我目前正在我的项目中进行乐观锁定管理。我们使用 JPA 2.0 (hibernate-jpa2.0-api-1.0.1.Final),数据源由 JBoss 7 提供。

我做了什么

在我的实体“AccordSimple”中,我使用@Version 注释:

这是我的 AccordServiceImpl

这样,不会抛出 OptimisticLockException。即使合并前一致的版本包含在我的数据库中的版本之下。

我已经找到了原因。这是负责人:

因为如果我将方法更改为:

将抛出 OptimisticLockException!

问题

该版本来自 Hibernate 缓存,而不是来自我的 DTO。因此,如果我分离实体,那么一切都会正常工作(我猜),但我不想这样做(如果开发人员忘记它,则会出现错误的来源......)。

你有什么想法吗?

0 投票
1 回答
1028 浏览

hibernate - @Version 在休眠中,在集群环境中运行时不起作用...(乐观锁)

我有一个在它的一个字段上使用@version 的实体,我想实现如果两个事务同时修改这个实体,一个会失败(并获得乐观锁异常),另一个会成功。

当我在单个 JVM 上运行此测试时,这工作正常,但是当我在集群环境中运行时,两个事务成功并且没有抛出乐观锁。

我错过了什么吗?我需要在@Version 下使用“@Generated(GenerationTime.ALWAYS)”吗?

顺便说一句,我在我的应用程序中使用 Spring 和 hibrnate ......知道吗?