MySQL中意向鎖的備忘
- 2019 年 10 月 4 日
- 筆記
https://www.zhihu.com/question/51513268/answer/127777478
意向鎖的作用:
考慮這個例子:
事務A鎖住了表中的一行,讓這一行只能讀,不能寫。
之後,事務B申請整個表的寫鎖。
如果事務B申請成功,那麼理論上它就能修改表中的任意一行,這與A持有的行鎖是衝突的。
資料庫需要避免這種衝突,就是說要讓B的申請被阻塞,直到A釋放了行鎖。
資料庫要怎麼判斷這個衝突呢?
step1:事務B判斷表是否已被其他事務用表鎖鎖表
step2:事務B判斷表中的每一行是否已被行鎖鎖住。
注意step2,這樣的判斷方法效率實在不高,因為需要遍歷整個表。
於是就有了意向鎖。在意向鎖存在的情況下,事務A必須先申請表的意向共享鎖,成功後再申請一行的行鎖。
在意向鎖存在的情況下,上面的判斷可以改成:
step1:事務B判斷表是否已被其他事務用表鎖鎖表
step2:事務B發現表上已經有其他事務的意向共享鎖,說明表中有些行被共享行鎖鎖住了,因此,事務B申請表的寫鎖會被阻塞。
注意:申請意向鎖的動作是資料庫完成的,就是說,事務A申請一行的行鎖的時候,資料庫會自動先開始申請表的意向鎖,不需要我們程式設計師使用程式碼來申請。
說明:
Before SELECT…LOCK IN SHARE MODE or other shared lock, request an intention shared lock (「IS」) on the table.
Before SELECT…FOR UPDATE, INSERT, UPDATE, DELETE, request an intention exclusive lock (「IX」).
IS and IX locks allow access by multiple clients. They won』t necessarily conflict until they try to get real locks on the same rows.
But a table lock (ALTER TABLE, DROP TABLE, LOCKTABLES) blocks both IS and IX, and vice-versa.
意向鎖分為:意向共享鎖 IS LOCK 、意向排它鎖 IX LOCK
官方說明:
1.Before a transaction can acquire an S lock on a row in table t, it must first acquire an IS or stronger lock on t.
2.Before a transaction can acquire an X lock on a row, it must first acquire an IX lock on t.
鎖兼容性關係:
|
X |
IX |
S |
IS |
---|---|---|---|---|
X |
Conflict |
Conflict |
Conflict |
Conflict |
IX |
Conflict |
Compatible |
Conflict |
Compatible |
S |
Conflict |
Conflict |
Compatible |
Compatible |
IS |
Conflict |
Compatible |
Compatible |
Compatible |