運行以下測驗時@Version
在桌面上啟用Customer
@Test
public void actionsTest1 () throws InterruptedException {
CustomerState t = customerStateRepository.findById(1L).get();
Thread.sleep(20000);
t.setInvoiceNumber("1");
customerStateRepository.save(t);
}
在actionsTest1
睡覺時,我運行actionsTest2
將發票編號更新為 2。
@Test
public void actionsTest2 () throws InterruptedException {
CustomerState t = customerStateRepository.findById(1L).get();
t.setInvoiceNumber("2");
customerStateRepository.save(t);
}
當 actionsTest1 從睡眠狀態回傳時,它也會嘗試更新,并得到一個 ObjectOptimisticLockingFailureException
按預期作業。
但是,如果我運行actionsTest1
并且在它處于睡眠狀態時,我會打開一個 SQL 終端并進行原始更新
update customer
set invoice_number='3' where id=1
當actionsTest1
從睡眠狀態回傳時,它的版本控制機制不會捕獲這種情況并將值更新回 1。
這是預期的行為嗎?版本控制是否僅適用于 JPA 管理的連接?
uj5u.com熱心網友回復:
它按預期作業。如果您手動進行更新,則還必須更新您的版本。
如果您將 JPA 與 @Version 一起使用,則 JPA 會增加版本列。
要獲得預期的結果,您必須像這樣撰寫陳述句
update customer set invoice_number='3', version=XYZ (mabye version 1) where id=1
uj5u.com熱心網友回復:
這是預期的行為嗎?
是的。
版本控制是否僅適用于 JPA 管理的連接?
不,它也適用于使用任何其他方式更新您的資料。但是更新資料的一切都必須遵守樂觀鎖定的規則:
- 每當執行任何更新時增加版本列
- (僅當其他行程也想要檢測并發更新時才需要):在每次更新時檢查版本號是否自加載更新所基于的資料以來沒有更改。
uj5u.com熱心網友回復:
Hibernate 自動增加/更改@Version
資料庫中映射列中的值。
當您獲取物體記錄時,hibernate 會保留資料記錄的副本以及@Version
. 在執行merge
orupdate
操作時,hibernate 會檢查 Version 中的當前值是否仍然相同并匹配之前獲取的物體副本。如果值匹配,則表示物體不臟(未由任何其他事務更新),否則拋出例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/470600.html