我有一個帶有樂觀鎖定的物體:
@Version
private Integer version;
我通過 id 做一個 get 請求,它findById
在后端執行 a 。我使用 id 使用 PUT 方法執行更新save,該方法在后端執行 a 。之后,我再次執行 get 以取回修改后的物件:之后我嘗試再次更新它并獲得:
{
"timestamp": {
"nano": 305933000,
"epochSecond": 1638524115
},
"status": 500,
"error": [],
"type": "ObjectOptimisticLockingFailureException",
"path": "uri=/rooms/",
"message": "Internal Server Error"
}
為什么我會收到那個錯誤?第一個更新事務應該完成,不是嗎?如何解鎖物體?
我不使用EntityManger. 我用JpaRepsoitory與save方法。
編輯
如果我在 get 呼叫中提供版本作為屬性并將版本設定到我保存它的物體中。
這是你通常的做法嗎?客戶端必須提供應該更新的物體的最新版本嗎?
uj5u.com熱心網友回復:
在資料庫中執行保存之前,您不會收到例外,并且您的保存不會立即發生,請記住它使用事務性后寫。
如果您的重繪 模式是 AUTO,這是 JPA 的默認設定,那么在您的第二個 findById 之前保存不會被推送到資料庫,這被視為運行查詢,因此必須首先重繪 任何更新。一旦更新執行,版本比較發生,JPA 意識到沒有行被更新,并拋出樂觀鎖定例外。
順便說一句,當您說您沒有使用 EntityManager 時:您沒有直接使用一個,但仍然涉及一個,JPA 存盤庫正在使用一個。所有這些隱藏更新和決定何時推送更新的事情都是由 EntityManager 完成的。它還快取運行查詢的結果。
當您說當前狀態時,有幾種狀態。有物體管理器的狀態,然后是正在進行的事務的狀態,然后是具有已提交更改的資料庫的狀態。EntityManager 使用重繪 模式來決定何時將其自己的第一級快取狀態與正在進行的事務同步。
是的,您必須為正在更新的物體提供最新版本號,這就是比較的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372977.html
