首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate乐观锁机制

hibernate乐观锁机制
EN

Stack Overflow用户
提问于 2017-10-18 04:04:11
回答 1查看 510关注 0票数 0

我对hibernate乐观锁(专用版本方式)非常好奇,所以我检查了hibernate源代码,它告诉我们在当前事务提交之前它会检查版本,但是如果在从DB查询version列之后发生了另一个事务(在很短的时间间隔内),那么当前事务认为没有变化,所以旧的事务会被错误地替换。

EntityVerifyVersionProcess.java

代码语言:javascript
复制
@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领域的专家,谁会帮助我在这方面。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-18 07:19:52

根据对代码的快速浏览,EntityVerifyVersionProcess用于读取事务,因此不涉及数据丢失。这只会检查当事务提交时,它不会返回已经过时的数据。对于READ COMMITTED事务,我想这可能会返回那些立即失效的数据,但如果不详细说明,就很难说了。

另一方面,编写事务使用EntityIncrementVersionProcess,这是一种完全不同的方式,不会给种族条件留下任何机会。

代码语言:javascript
复制
public void doBeforeTransactionCompletion(SessionImplementor session) {
    final EntityPersister persister = entry.getPersister();
    final Object nextVersion = persister.forceVersionIncrement( entry.getId(), entry.getVersion(), session );
    entry.forceLocked( object, nextVersion );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46802614

复制
相关文章

相似问题

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