mysql--->innodb引擎何時表鎖何時行鎖?

mysql innodb引擎何時表鎖何時行鎖?

InnoDB基於索引的行鎖
  • InnoDB行鎖是經過索引上的索引項來實現的,這一點MySQL與Oracle不一樣,後者是經過在數據中對相應數據行加鎖來實現的。InnoDB這種行鎖實現特色意味者:只有經過索引條件檢索數據,InnoDB纔會使用行級鎖,不然,InnoDB將使用表鎖
  • 在MySQL中,行級鎖並非直接鎖記錄,而是鎖索引。索引分爲主鍵索引和非主鍵索引兩種,若是一條sql語句操做了主鍵索引,MySQL就會鎖定這條主鍵索引;若是一條語句操做了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。 在UPDATE、DELETE操做時,MySQL不只鎖定WHERE條件掃描過的全部索引記錄,並且會鎖定相鄰的鍵值,即所謂的next-key locking。
innodb行鎖和表鎖的狀況
  • 因爲InnoDB預設是Row-Level Lock,因此只有「明確」的指定主鍵,MySQL纔會執行Row lock (只鎖住被選取的資料例) ,不然MySQL將會執行Table Lock (將整個資料表單給鎖住):
    • (明確指定主鍵,而且有此筆資料,row lock) SELECT * FROM products WHERE id='3' FOR UPDATE; SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;
    • (明確指定主鍵,若查無此筆資料,無lock) SELECT * FROM products WHERE id='-1' FOR UPDATE;
    • (無主鍵,table lock) SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
    • (主鍵不明確,table lock) SELECT * FROM products WHERE id<>'3' FOR UPDATE;
    • (主鍵不明確,table lock) SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
有時有索引也會致使表鎖的狀況
  • 致使這個的緣由第一是sql語句寫法問題,沒有合理構建和使用索引。
  • 第二個緣由是mysql的優化器,有時優化器發現:即便使用了索引,仍是要作全表掃描,故而放棄了索引,也就沒有使用行鎖,卻使用了表鎖
索引類型對鎖類型的影響
  • 主鍵:衆所周知,自帶最高效的索引屬性
  • 惟一索引:屬性值重複率爲0,能夠做爲業務主鍵
  • 普通索引:屬性值重複率大於0,不能做爲惟一指定條件
  • 注意:對於普通索引,當「重複率」低時,甚至接近主鍵或者惟一索引的效果時,依然是行鎖;可是若是「重複率」高時,Mysql不會把這個普通索引當作索引,即會形成一個沒有索引的SQL,從而造成表鎖。
鎖等待
  • 鎖等待理解
    • 即當一個事務要操做一個資源時,這個資源已經被其它事務先鎖定使用,那麼後者事務只能等待上一個事務執行完畢釋放資源使用權後才能繼續操做,而這個等待的過程就是鎖等待;
    • 若是等待時間過長,超過配置項中的設定的時間,則會報錯(鎖等待錯誤)
  • 緣由
    • 都使用表鎖
    • 一個使用行鎖,一個使用表鎖
    • 都是用行鎖

參考:https://www.linuxidc.com/Linux/2017-02/141110.htm http://www.javashuo.com/article/p-sdmsosyo-gx.htmlhtml

相關文章
相關標籤/搜索