我很好奇hibernate樂觀鎖(專用版本的方式),我檢查了hibernate源代碼,它告訴它在當前事務提交之前檢查版本,但是如果在查詢之後發生了另一個事務DB中的版本列(在很短的時間間隔內),那麼當前交易認爲沒有變化,所以舊的交易將被錯誤地替換。hibernate樂觀鎖機制
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領域的專家誰會幫助我。
非常感謝。
這會使它破碎和無用。不是一個很好的廣告「使用樂觀鎖定,它通常不會損壞您的數據!」。 – Kayaman
嗯,其實我不認爲這是一個重複的問題,這個問題是關於樂觀鎖機制,但我不是... – user2015063
你不是什麼?這似乎正是你在說什麼,不,沒有事情打破的機會。如果樂觀鎖定失敗,一個事務將被回滾。 – Kayaman