兩個執行緒同時運算元據庫時,希望可以實現,乙個執行緒在修改資料庫的時候,另外乙個執行緒不能對同一條資料進行修改。
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,則更新...