1. 程式人生 > 其它 >MySQL學習(四)鎖機制

MySQL學習(四)鎖機制

  • 分類
    • 讀鎖(共享鎖):對同一個資料,多個讀操作可以同時進行,互不干擾
    • 寫鎖(互斥鎖):如果當前寫操作沒有完畢,則無法進行其他的讀操作、寫操作
  • 操作範圍
    • 表鎖:一次性對一張表整體加鎖。如myisam儲存使用引擎,開銷小,加鎖快,無死鎖;鎖的範圍大,容易發生鎖衝突,併發低
    • 行鎖:一次性對一條資料加鎖。如innodb使用行鎖,開銷大,加鎖滿,容易死鎖;鎖的範圍小,不易發生鎖衝突,併發度高(很小概率,發生高併發問題、不可重複讀,丟失更新等問題)
      • 間隙鎖(next-key):值在範圍內,但卻不存在

此時表中沒有id=7的資料
update linelock set name = 'x' wher id > 1 and id < 9;

加鎖 lock table 表1 read/write,表2 read/write
檢視加鎖的表: show open tables;

1.加讀鎖

結論1:一個會話,對A表加了read鎖,則該會話可以對A表進行讀操作,不能進行寫操作;且該會話不能對其他表進行讀、寫操作。(即如果給A表加了讀鎖,則當前會話只能對A表進行讀操作)

結論2:會話0對A表加了鎖,其他會話的操作:

  • 可以對其他表(A表以外的表)進行讀、寫操作
  • 對A表可以讀,寫-需要等待釋放鎖 unlocal tables;

2.加寫鎖

會話0: lock table tablename write;
總結1:當前會話可以對加了寫鎖的表,可以進行任何操作(增刪改查);但是不能操作(增刪改查)其他表.
總結2:對會話0加寫鎖的表,可以進行增刪改查的前提是:等會話0釋放寫鎖。

3.行鎖分析

  1. 如果會話x對某條資料a進行DML操作(研究時,關閉了自動commit的情況下),則其他會話必須等待會話x結束事務(commit/rollback)後,才能對資料a進行DML操作
  2. 表鎖是通過 unlock tables; ,也可以通過事務解鎖,行鎖是通過事務解鎖。
  3. 如果沒有索引/索引失效,則行鎖會轉為表鎖
  4. 行鎖:如果有where,則實際加鎖的範圍就是where後面的範圍(不是實際的值 )
    show status like '%innodb_row_lock%';
  • innodb_row_lock_current_waits; 當前正在等待鎖的數量
  • innodb_row_lock_time; 等待總時長。從系統啟動到現在一共等待的時間
  • innodb_row_lock_time_avg; 平均等待時長

如果僅僅是查詢資料,能否加鎖?可以 for update:
select * from linelock where id = 2 for update;

4.InnoDB鎖問題

參考部落格:https://www.cnblogs.com/jpfss/p/8890250.html
InnoDB和MyISAM最大不同有兩點:一是支援事務;二是採用了行級鎖