84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
Innodb 實作了兩個行層級的鎖, 一個是共用鎖,一個是排它鎖。 請問:(1)行層級的鎖定是不是只能載入行記錄上?為什我看到有的地提到表級上也可以共享鎖和排它鎖呢?
各位可以提示嗎
InnoDB的行鎖只在鎖語句(也就是FOR UPDATE和LOCK IN SHARE MODE)使用到索引時才有效,因為InnoDB鎖的其實是根據索引鎖住行的。也就是說,如果沒有使用索引,鎖定就會自動提升到表格層級。
如果樓上所說,在事物隔離等級為repeat read下(mysql預設等級)InnoDB引擎在修改刪除資料時,會先查找到對應的索引,索引都是排序了的,所以會鎖住某個值或者某個範圍。 如果這個範圍是整個索引段,那麼則整個表數據均會被鎖住;另外沒有索引,在做修改刪除操作的時候會全表掃描數據,自然也會鎖全表。
InnoDB實作了以下兩種類型的行鎖定。 共享鎖定(s):允許一個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。 排他鎖(X):允許獲取排他鎖的事務更新數據,阻止其他事務取得相同的數據集共享讀鎖和排他寫鎖。 另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。 意向共享鎖(IS):交易打算給資料行共享鎖,事務在給一個資料行加共享鎖前必須先取得該表的IS鎖。 意向排他鎖(IX):事務打算為資料行加排他鎖,事務在給一個資料行加排他鎖前必須先取得該表的IX鎖。
行鎖是加在行上的,表鎖就是對應整個表。行鎖和表鎖是可以共存的!
鎖是mysql引擎都有的。行鎖和表鎖是在鎖粒度的角度上區分的
InnoDB的行鎖只在鎖語句(也就是FOR UPDATE和LOCK IN SHARE MODE)使用到索引時才有效,因為InnoDB鎖的其實是根據索引鎖住行的。也就是說,如果沒有使用索引,鎖定就會自動提升到表格層級。
如果樓上所說,在事物隔離等級為repeat read下(mysql預設等級)
InnoDB引擎在修改刪除資料時,會先查找到對應的索引,索引都是排序了的,所以會鎖住某個值或者某個範圍。
如果這個範圍是整個索引段,那麼則整個表數據均會被鎖住;另外沒有索引,在做修改刪除操作的時候會全表掃描數據,自然也會鎖全表。
InnoDB實作了以下兩種類型的行鎖定。
共享鎖定(s):允許一個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。
排他鎖(X):允許獲取排他鎖的事務更新數據,阻止其他事務取得相同的數據集共享讀鎖和排他寫鎖。
另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。
意向共享鎖(IS):交易打算給資料行共享鎖,事務在給一個資料行加共享鎖前必須先取得該表的IS鎖。
意向排他鎖(IX):事務打算為資料行加排他鎖,事務在給一個資料行加排他鎖前必須先取得該表的IX鎖。
行鎖是加在行上的,表鎖就是對應整個表。行鎖和表鎖是可以共存的!
鎖是mysql引擎都有的。行鎖和表鎖是在鎖粒度的角度上區分的