Hibernate-悲观的写入锁定模式在Oracle DB中未按预期工作

Hibernate-悲观的写入锁定模式在Oracle DB中未按预期工作,oracle,hibernate,Oracle,Hibernate,Hibernate 4.2悲观写锁在Oracle数据库中运行不正常,而使用PostgreSQL和Microsoft SQL Server时,它可以按预期工作。 有什么想法吗 让我再解释一下 我在日志中获得了StaleObjectException StaleObjectException:-“行已被其他行更新或删除 事务(或未保存的值映射不正确)休眠“ Hibernate无法在OracleDB上保持悲观的写锁定模式,但在其他DB中工作正常。这是在并发模式下访问的(多线程环境) 代码:- priv

Hibernate 4.2悲观写锁在Oracle数据库中运行不正常,而使用PostgreSQL和Microsoft SQL Server时,它可以按预期工作。 有什么想法吗

让我再解释一下

我在日志中获得了
StaleObjectException

StaleObjectException:-“行已被其他行更新或删除 事务(或未保存的值映射不正确)休眠“

Hibernate无法在OracleDB上保持悲观的写锁定模式,但在其他DB中工作正常。这是在并发模式下访问的(多线程环境)

代码:-

private static final String query1= "select e from EMPLOYEE e join e.addressList address where address in (:addressList) order by e.streetName,e.createdOn";

Query query = getSession().createQuery(query1).setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));

问题在于Hibernate如何处理Oracle中的悲观写锁。 每当执行悲观锁定以锁定行时,其他数据库都会触发单个查询以获取该行并锁定该行,以便其他事务无法修改加载的记录。这是不同的处理方式 如果是Oracle,则使用Hibernate。对于Oracle,它会触发两个查询,一个用于加载记录,另一个用于使用“SELECTFORUPDATE”子句锁定加载的记录。现在的问题是,由Hibernate for Oracle生成的两条sql语句不是原子的,也不受锁的控制,因此在内部,我们触发的单个查询将转换为两个查询。由于这两个查询不是原子的,如果两个线程触发我们的查询,那么这两个查询都会加载相同的记录而不锁定。 在此之后,第一个线程获取锁(第二个线程已经加载了锁)并对其进行更新。现在,当第二个线程尝试获取它已经加载的记录的锁时,它会检测到一个更改,因为第一个线程已经更新了它,因此 引发过时的对象异常。由于这是核心Hibernate平台的一个问题,我们无法修复此缺陷的根本原因


我们找到了一种解决方法。为了解决这个问题,我们引入了一种变通方法,在触发实际查询之前通过悲观写入锁定另一个表。这将确保线程锁定行为能够正常工作,而以响应时间的少量增加(几毫秒)为代价。

“行为不正常”-我们应该知道这意味着什么?请显示为。如果您需要更多详细信息,请告诉我