pessimistic locking
樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。
悲觀鎖還是樂觀鎖,都是人們定義出來的概念,是一種思想。
對於資料庫:
悲觀鎖:
在資料處理過程,將資料處於鎖定狀態,一般使用資料庫的鎖機制實現。
從廣義上來講,前面提到的行鎖、表鎖、讀鎖、寫鎖、共享鎖、排他鎖等,這些都屬於悲觀鎖範疇。
表級鎖
表級鎖每次操作都鎖住整張表,併發度最低。常用命令如下:
手動增加表鎖:
lock table 表名稱 read|write, 表名稱2 read|write;
檢視表上加過的鎖
show open tables;
刪除表鎖
unlock tables;
表級讀鎖:當前表追加
read
鎖,當前連線和其他的連線都可以讀操作;但是當前連線增刪改操作會報錯,其他連線增刪改會被阻塞。
表級寫鎖:當前表追加
write
鎖,當前連線可以對錶做增刪改查操作,其他連線對該錶所有操作都被阻塞(包括查詢)。
共享鎖(行級鎖-讀鎖)
共享鎖又稱為讀鎖,簡稱
s鎖。共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。
使用共享鎖的方法是在
select ... lock in share mode
,只適用查詢語句。
總結:事務使用了共享鎖(讀鎖),只能讀取,不能修改,修改操作被阻塞。
排他鎖(行級鎖-寫鎖)
排他鎖又稱為寫鎖,簡稱
x鎖。排他鎖就是不能與其他鎖並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能對該行記錄做其他操作,也不能獲取該行的鎖。
使用排他鎖的方法是在
sql末尾加上
for update
,innodb
引擎缺省會在
update
,delete
語句加上for update。行級鎖的實現其實是依靠其對應的索引,所以如果操作沒用到索引的查詢,那麼會鎖住全表記錄。
總結:事務使用了排他鎖(寫鎖),當前事務可以讀取和修改,其他事務不能修改,也不能獲取記錄鎖(select... for update)。如果查詢沒有使用到索引,將會鎖住整個表記錄。
樂觀鎖:
樂觀鎖是相對於悲觀鎖而言的,它不是資料庫提供的功能,需要開發者自己去實現。在資料庫操作時,
想法很樂觀,認為這次的操作不會導致衝突,因此在資料庫操作時並不做任何的特殊處理,即不加鎖,
而是在進行事務提交時再去判斷是否有衝突了。
樂觀鎖實現的關鍵點:衝突的檢測。
樂觀鎖實現原理
使用版本字段(
version
) 先給資料表增加乙個版本
(version)
字段,每操作一次,將那條記錄的版本號加1。
version
是用來檢視被讀的記錄有無變化,作用是防止記錄在業務處理期間被其他事務修改。
2.使用時間戳(
timestamp)
與使用version
版本字段相似,同樣需要給在資料表增加乙個字段,字段型別使用
timestamp
時間戳。也是在更新提交的時候檢查當前資料庫中資料的時間戳和自己更新前取到的時間戳
進行對比,如果一致則提交更新,否則就是版本衝突,取消操作。
樂觀鎖案例,例如:
select (quantity,version) from products where id=1;
insert into orders ...
insert into items ...
update products set quantity=quantity-1,version=version+1
where id=1 and version=#;
悲觀鎖和樂觀鎖都可以解決事務寫寫併發,在應用中可以根據併發處理能力選擇區分,比如對併發率要
求高的選擇樂觀鎖;對於併發率要求低的可以選擇悲觀鎖。
除了自己手動實現樂觀鎖之外,許多資料庫訪問框架也封裝了樂觀鎖的實現,比如
hibernate框架。mybatis框架可以使用optimisticlocker外掛程式來擴充套件。
MySQL 悲觀鎖 樂觀鎖
悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發程式設計中乙個非常基礎的概念。本文將對這兩種常見的鎖機制在資料庫資料上的實現進行比較系統的介紹。悲觀鎖 pessimistic lock 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...
MySQL 悲觀鎖 樂觀鎖
悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發程式設計中乙個非常基礎的概念。本文將對這兩種常見的鎖機制在資料庫資料上的實現進行比較系統的介紹。悲觀鎖 pessimistic lock 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...
悲觀鎖與樂觀鎖
悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...