天天看點

InnoDB的意向鎖

鎖類型

InnoDB存儲引擎實作了如下兩種标準的行級鎖:

  • 共享鎖(S Lock),允許事務讀一行資料
  • 排他鎖(X Lock),允許事務删除或更新一行資料
InnoDB的意向鎖
InnoDB的意向鎖

舉例來說,在對記錄r加X鎖之前,已經有事務對表1進行了S表鎖,那麼表1上已存在S表鎖,之後事務需要對記錄r在表1上加上IX,由于不相容,是以該事務需要等待表鎖的釋放

InnoDB的意向鎖

通過一個例子來透徹了解共享鎖的作用:

  • 事務A鎖住了表中的一行,讓這一行隻能讀,不能寫。
  • 之後,事務B申請整個表的寫鎖。
  • 如果事務B申請成功,那麼理論上它就能修改表中的任意一行,這與A持有的行鎖是沖突的。

資料庫需要避免這種沖突,就是說要讓B的申請被阻塞,直到A釋放了行鎖。

資料庫要怎麼判斷這個沖突呢?

  • step1:判斷表是否已被其他事務用表鎖鎖表
  • step2:判斷表中的每一行是否已被行鎖鎖住。

step2注定不行,周遊效率太低了

于是就有了意向鎖。

在意向鎖存在的情況下,事務A必須先申請表的意向共享鎖,成功後再申請一行的行鎖。

在意向鎖存在的情況下,上面的判斷可以改成:

  • step1:不變
  • step2:發現表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,是以,事務B申請表的寫鎖會被阻塞。

申請意向鎖的動作是資料庫完成的,就是說,事務A申請一行的行鎖的時候,資料庫會自動先開始申請表的意向鎖,不需要我們程式員使用代碼來申請。

繼續閱讀