gpt4 book ai didi

java - hibernate乐观锁机制

转载 作者:行者123 更新时间:2023-12-02 12:07:21 28 4
gpt4 key购买 nike

我对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"
);
}
}

这种情况可能吗?

希望有数据库领域专家能在这方面帮助我。

非常感谢。

最佳答案

快速浏览一下代码,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 );
}

关于java - hibernate乐观锁机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802614/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com