容許不一樣事務以前共享加鎖讀取,但不容許其它事務修改或者加入排他鎖
若是有修改必須等待一個事務提交完成,才能夠執行,容易出現死鎖mysql
session1:sql
start transaction; select * from test where id = 1 lock in share mode;
session2:session
start transaction; select * from test where id = 1 lock in share mode;
<!--more-->併發
此時session1和session2均可以正常獲取結果,那麼再加入session3 排他鎖讀取嘗試rest
session3:code
start transaction; select * from test where id = 1 for update;
在session3中則沒法獲取數據,直到超時或其它事物commit事務
Lock wait timeout exceeded; try restarting transaction
當session1執行了修改語句:
session1:get
update test set name = 'kkkk' where id = 1;
能夠不少獲取執行結果。
當session2再次執行修改id=1的語句時:
session2:it
update test set name = 'zzz' where id = 1;
就會出現死鎖或者鎖超時,錯誤以下:io
Deadlock found when trying to get lock; try restarting transaction
或者:
Lock wait timeout exceeded; try restarting transaction
必須等到session1完成commit動做後,session2纔會正常執行,若是此時多個session併發執行,可想而知出現死鎖的概率將會大增。
session3則更不可能
mysql共享鎖(lock in share mode
)
for update
)共享鎖,事務都加,都能讀。修改是唯一的,必須等待前一個事務commit,纔可
當一個事物加入排他鎖後,不容許其餘事務加共享鎖或者排它鎖讀取,更加不容許其餘事務修改加鎖的行。
一樣以不一樣的session來舉例
session1:
start transaction; select * from test where id = 1 for update;
session2:
start transaction; select * from test where id = 1 for update;
當session1執行完成後,再次執行session2,此時session2也會卡住,沒法馬上獲取查詢的數據。直到出現超時
Lock wait timeout exceeded; try restarting transaction
或session1 commit纔會執行
那麼再使用session3 加入共享鎖嘗試
select * from test where id = 1 lock in share mode;
結果也是如此,和session2同樣,超時或等待session1 commit
Lock wait timeout exceeded; try restarting transaction
當在session1中執行update語句:
update test set name = 123 where id = 1;
能夠正常獲取結果
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
此時在session2中執行修改
update test set name = 's2' where id = 1;
則會卡住直接超時或session1 commit,纔會正常吐出結果
session3也很明顯和session2同樣的結果,這裏就很少贅述
不容許其它事務增長共享或排他鎖讀取。修改是唯一的,必須等待前一個事務commit,纔可