悲觀鎖:
? ? 1> 概念:當我們對一個數(shù)據(jù)庫的一條數(shù)據(jù)進行修改時窃页,為了避免同時被其它人修改,最好的方式就是對該數(shù)據(jù)進行加鎖以防止并發(fā)訪問观蓄,這種借助數(shù)據(jù)庫鎖機制在修改數(shù)據(jù)前先鎖定氧卧,在修改的方式被稱之為悲觀并發(fā)控制,又叫悲觀鎖彻采。Pessimistic Concurrency Control
? ? 2> 實現(xiàn)方式:往往依靠數(shù)據(jù)庫提供的鎖機制,在數(shù)據(jù)庫中流出如下:
? ? ? ? ? ? 1> 在對記錄進行修改前捌归,先嘗試為該記錄加上排他鎖(exclusive locking)
? ? ? ? ? ? 2> 如果加鎖失敗肛响,說明該記錄正在被修改,那么查詢等待或者拋出異常惜索,具體響應方式由開發(fā)者自行決定
? ? ? ? ? ? 3> 如果成功加鎖特笋,那么就可以對記錄做修改,事物完成自動解鎖
? ? ? ? ? ? 4> 期間如果有其它事物對該記錄做加鎖的操作巾兆,都要等待當前事物解鎖或者拋異常
? ? ? ? 悲觀鎖猎物,必須關閉數(shù)據(jù)庫自動提交的屬性,set autocommit=0?
? ? ? ? begin; 開啟事物
? ? ? ? select quantity from table where id =1 for update 角塑;查詢庫存信息
? ? ? ? update table? set quantitiy = 2 where id = 1;
? ? ? ? commit;提交事物? ? ? ? ? ? ? ??
樂觀鎖:
? ? ? ? 1> 概念:樂觀鎖相對于悲觀鎖而言蔫磨,樂觀鎖假設數(shù)據(jù)一般情況下不會造成沖突桐经,所以在數(shù)據(jù)進行提交更新的時候,才會對數(shù)據(jù)的沖突進行檢測轿曙,如果發(fā)現(xiàn)沖突了螟左,則返回用戶的錯誤信息,讓用戶自己決定辕宏。
? ? ? ? 2> 實現(xiàn)方式:不需要借助數(shù)據(jù)庫鎖機制; 采用版本號的方式流程如此
? ? ? ? ? ? ? ? 1> 沖突檢測和數(shù)據(jù)更新。實現(xiàn)方式一種典型的CAS