MyISAM和MEMORY存儲引擎採用的是表級鎖,InnoDB存儲引擎既支持行級鎖又支持表級鎖mysql
MySQL的表級鎖有兩種模式:表共享讀鎖和表獨佔寫鎖sql
一、對MyISAM表的讀操做,不會阻塞其餘用戶對同一表的讀請求,但會阻塞對同一表的寫請求session
注意:blog
①有兩個session,s1和s2,當s1中添加了表共享讀鎖時,s1會話中也不能夠進行新增、修改操做索引
②當s1會話中對某張表上了表共享讀鎖後,在s1會話中去查未上表共享讀鎖的表數據會報錯it
二、對MyISAM表的寫操做,會阻塞其餘用戶對同一表的讀和寫操做io
注意:table
InnoDB行鎖是經過給索引上的索引項加鎖來實現的,若表中無索引,則會進化爲表級鎖date
一、共享鎖:能進行讀操做,不能進行寫操做select
s一、s2兩個會話共同操做一張表
s1:select * from table where id=1 lock in share model;
s2:select * from table where id=2; 能夠正常查詢
s2:update table set name='111' where id=1; 此時不能進行修改操做
二、排他鎖
s一、s2兩個會話共同操做一張表
s1:select * from table where id=1 for update;
s2:查詢同張表數據沒問題select * from table where id=2;
select * from table where id=2 for update; 此時會報錯
三、自增鎖:針對自增列自增加的一種鎖
新建了一張表,往這張表中插入10條數據,未commit前回滾了,若此時向表中插入5條數據,id從11開始
四、模擬死鎖
圖左爲s1,圖右爲s2
①s一、s2先分別對id=1與id=2添加排他鎖
②s1中對id=2行添加排他鎖,執行
③s2中對id=1行添加排他鎖,執行
此時至關於四個鎖相互循環鎖死,mysql會自動釋放鎖,這就模擬了死鎖的場景