mysql的鎖機制

MyISAM和MEMORY存儲引擎採用的是表級鎖,InnoDB存儲引擎既支持行級鎖又支持表級鎖mysql

1、MyISAM表鎖

MySQL的表級鎖有兩種模式:表共享讀鎖和表獨佔寫鎖sql

一、對MyISAM表的讀操做,不會阻塞其餘用戶對同一表的讀請求,但會阻塞對同一表的寫請求session

  注意:blog

  ①有兩個session,s1和s2,當s1中添加了表共享讀鎖時,s1會話中也不能夠進行新增、修改操做索引

  ②當s1會話中對某張表上了表共享讀鎖後,在s1會話中去查未上表共享讀鎖的表數據會報錯it

二、對MyISAM表的寫操做,會阻塞其餘用戶對同一表的讀和寫操做io

2、InnoDB的行鎖模式及加鎖方法

注意: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會自動釋放鎖,這就模擬了死鎖的場景

相關文章
相關標籤/搜索