1、悲觀鎖
1-1、概念 :它指的是對數據被外界(包括當前系統的其它事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處於鎖定狀態。
1-2、悲觀鎖的實現方式 :
1-2-1、首先設置mysql的提交方式爲非自動提交(手動提交):set autocommit=0;
1-2-3、手動開啓事務,select... ...for update;手動提交事務。
例子:
2、樂觀鎖
2-1、概念:樂觀鎖相對悲觀鎖而言,它認爲數據一般情況下不會造成衝突,所以在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,如果發現衝突了,則讓返回錯誤信息,讓用戶決定如何去做。
2-2、樂觀鎖的實現方式(CAS):
2-2-1、爲表中添加一個 version 字段。
2-2-2、當讀取數據時,連同這個 version 字段一起讀出。
2-2-3、數據每更新一次就將此值加一。
2-2-4、當提交更新時,判斷數據庫表中對應記錄的當前版本號是否與之前取出來的版本號一致,如果一致則可以直接更新,如果不一致則表示是過期數據需要重試或者做其它操作。
例子:
select 當前版本號 from employee where xxx=xxxx;
UPDATE employee SET money = #{期待值}, version = #{當前版本號} + 1 WHERE id = #{e.id} AND #{當前版本號} = version