簡單的樂觀鎖實現
更新的時候給版本號字段加上 1,然後 update 會返回乙個更新結果的行數,通過這個行數去判斷。
update 必須這樣寫:
update t_user uset u.address = #address#,
u.version = u.version + 1
where u.username = #username#
and u.version = #version#
如果更新執行返回的數量是 0 表示產生併發修改了,需要重新獲得最新的資料後再進行更新操作。
hibernate、jpa 等 orm 框架或者實現,是使用版本號,再判斷 update 後返回的數值,如果這個值小於 1 時則丟擲樂觀鎖併發修改異常。
參見:
樂觀所 悲觀鎖
悲觀鎖 具有排他性,在讀取資料後,會在這條資料上加鎖,其他使用者是操作不了這條資料的。一般用於事務較短,併發不大的場景。樂觀鎖其實是一種思想,每次讀取資料的時候不會加鎖,但是在進行更新操作的時候,需要判斷 在次之前資料是否被更改過 可以使用版本號等方法 如果資料已經被更改了則拒絕本次 更新操作,在最...
樂觀鎖和悲觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖和悲觀鎖
併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...