mysql的表鎖和行鎖,排他鎖和共享鎖。


1、表鎖和行鎖

表鎖和行鎖鎖的粒度不一樣,表鎖鎖住的是一整張表,行鎖鎖住的是表中的一行數據,行鎖是開銷最大的鎖策略,表鎖是開銷最小的鎖策略。

InnoDB使用的是行級鎖,MyISAM使用的是表級鎖。

注意:在InnoDB中,例如模糊查詢select * from tb where name like 'lin%'的時候也會鎖住一整張表。

2、共享鎖和排他鎖

共享鎖又稱讀鎖(S鎖),一個事務獲取了共享鎖,其他事務可以獲取共享鎖,不能獲取排他鎖,其他事務可以進行讀操作,不能進行寫操作。

排他鎖又稱寫鎖(X鎖),如果事務T對數據A加上排他鎖后,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。

對於insert、update、delete,InnoDB會自動給涉及的數據加排他鎖(X);

對於一般的Select語句,InnoDB不會加任何鎖,事務可以通過以下語句給顯示加共享鎖或排他鎖。

共享鎖:SELECT ... LOCK IN SHARE MODE;

排他鎖:SELECT ... FOR UPDATE;

共享鎖例子:

事務一:使用lock in share lock獲取共享鎖,開始事務,不提交也不回滾

事務二:對同一條記錄進行修改,會產生阻塞,查詢不會阻塞

事務三:對同一記錄進行查詢(加共享鎖),不阻塞,共享鎖允許其他事務也獲取共享鎖

排他鎖例子:

事務一:select語句后跟for update獲取排他鎖,其他事務不能進行查詢和修改的操作

 

事務二:對同一記錄進行加鎖查詢會被阻塞

事務三:對該記錄的加鎖寫操作會阻塞

參考網址:http://www.hollischuang.com/archives/923


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM