hibernate乐观锁机制

时间:2017-10-18 04:04:12

标签: java database hibernate transactions optimistic-locking

我对hibernate乐观锁(专用版本方式)很好奇,我检查了hibernate源代码,它告诉它在当前事务提交之前检查版本,但是如果在查询版本列之后还有其他事务发生了提交DB(在非常短的时间间隔内),然后当前事务认为没有变化,因此旧事务将被错误地替换。

EntityVerifyVersionProcess.java

@Override
    public void doBeforeTransactionCompletion(SessionImplementor session) {
        final EntityPersister persister = entry.getPersister();

        if ( !entry.isExistsInDatabase() ) {
            // HHH-9419: We cannot check for a version of an entry we ourselves deleted
            return;
        }

        final Object latestVersion = persister.getCurrentVersion( entry.getId(), session );
        if ( !entry.getVersion().equals( latestVersion ) ) {
            throw new OptimisticLockException(
                    object,
                    "Newer version [" + latestVersion +
                            "] of entity [" + MessageHelper.infoString( entry.getEntityName(), entry.getId() ) +
                            "] found in database"
            );
        }
    }

这种情况可能吗?

希望有DB领域专家帮助我。

非常感谢。

1 个答案:

答案 0 :(得分:1)

基于对代码的快速浏览,EntityVerifyVersionProcess用于读取事务,因此不存在涉及数据丢失的可能性。这只会检查当事务提交时,它不会返回已经过时的数据。使用READ COMMITTED事务,我认为可能会返回即时过时的数据,但很难说而不会详细说明。

另一方面写交易使用EntityIncrementVersionProcess,这是一个完全不同的野兽,不会有竞争条件。

public void doBeforeTransactionCompletion(SessionImplementor session) {
    final EntityPersister persister = entry.getPersister();
    final Object nextVersion = persister.forceVersionIncrement( entry.getId(), entry.getVersion(), session );
    entry.forceLocked( object, nextVersion );
}