1、表鎖和行鎖 表鎖和行鎖鎖的粒度不一樣,表鎖鎖住的是一整張表,行鎖鎖住的是表中的一行數據。 InnoDB使用的是行級鎖,MyISAM使用的是表級鎖。 註意:在InnoDB中,例如模糊查詢select * from tb where name like 'lin%'的時候也會鎖住一整張表。 2、共用 ...
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