【发布时间】:2018-03-29 21:08:59
【问题描述】:
我对休眠乐观锁(专用版本方式)非常好奇,我检查了休眠源代码,它告诉它在当前事务提交之前检查版本,但是如果在查询版本列之后有另一个事务恰好提交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"
);
}
}
这种情况可能吗?
希望有数据库领域专家可以帮助我。
非常感谢。
【问题讨论】:
-
这会使它损坏和无用。不是一个很好的广告“使用乐观锁定,它通常不会破坏您的数据!”。
-
hmmm,其实我不认为这是一个重复的问题,那个问题是关于乐观锁机制的,但我不是......
-
你不是什么?这似乎正是你所说的,不,事情没有破裂的机会。如果乐观锁定失败,一个事务将被回滚。
-
hibernate 源代码使用 SQL "SELECT VERSION FROM xx" 方式来检查版本更改,而不是附加 "WHERE VERSION=?"子句做
标签: java database hibernate transactions optimistic-locking