資料庫樂觀鎖

2021-09-05 09:07:41 字數 1009 閱讀 5600

兩個執行緒同時運算元據庫時,希望可以實現,乙個執行緒在修改資料庫的時候,另外乙個執行緒不能對同一條資料進行修改。

sql語句

update money set money = money+

1, version = version+

1where id =

# and version = #

測試類

executorservice fixedthreadpool = executors.

newfixedthreadpool(5

);fixedthreadpool.

execute((

)->

catch

(exception e)})

; fixedthreadpool.

execute((

)->

catch

(exception e)})

; fixedthreadpool.

execute((

)->

catch

(exception e)})

; thread.

sleep

(1000);

}public

void

update()

執行結果

這裡遇到乙個問題,主線程需要休眠,才能在測試類中獲得資料庫連線,運算元據庫,如果不休眠主線程,就會報錯資料庫連線池關閉。這是因為資料庫連線池是執行test主線程的時候建立的,主線程執行完畢,關閉資料庫連線池。此時子執行緒並未執行完畢,因此在子執行緒獲取資料庫連線的時候報錯,程式執行失敗。

資料庫樂觀鎖

百上千個併發,這樣的情況將導致怎樣的後果。樂觀鎖機制在一定程度上解決了這個問題。樂觀鎖,大多是基於資料版本 version 記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於 資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 version 欄位來 實現。讀取出資料時,將此版本號一同...

資料庫樂觀鎖

樂觀鎖不是資料庫自帶的,需要我們自己去實現。樂觀鎖是指運算元據庫時 更新操作 想法很樂觀,認為這次的操作不會導致衝突 a使用者操作的時,沒有任何人操作該條記錄 在運算元據時,並不進行任何其他的特殊處理 也就是不加鎖 而在進行更新後,再去判斷是否有衝突了。通常實現是這樣的 在表中的資料進行操作時 更新...

資料庫樂觀鎖

簡單來說就是增加乙個字段 version 用來記錄更新的版本,更新前先查詢版本 然後進行更新操作時判斷版本是否等於上一步查詢的版本,如果是則成功 並且將版本公升級 1 select stock,version from table store 查詢出當前版本 如查詢的version字段值為2,則更新...