首頁  >  文章  >  資料庫  >  MySQL事務、鎖以及應用(二)

MySQL事務、鎖以及應用(二)

黄舟
黄舟原創
2017-02-06 10:40:541056瀏覽

InnoDB支援事務,支援行鎖和表鎖,MyISAM不支援事務,只支援表鎖。這裡只介紹InnoDB。

InnoDB實作了以下兩種類型的行鎖定。

  • 共享鎖定(S):允許一個事務去讀取一行,並阻止其他事務獲得相同資料集的排他鎖。

  • 排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同數據集的共享讀鎖和排他寫鎖。

另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。

  • 意向共享鎖定(IS):交易打算將資料行加行共享鎖定,而交易在給一個資料行加上共享鎖前必須先取得該表的IS鎖定。

  • 意向排他鎖(IX):事務打算將資料行加行排他鎖,事務在給一個資料行加排他鎖前必須先取得該表的IX鎖。

InnoDB行鎖定模式相容性清單

X衝突衝突衝突衝突IX衝突衝突兼容如果一個事務請求的鎖定模式與當前的鎖兼容,InnoDB就將請求反的鎖授予該事務兼容;該事務就要等待鎖釋放。 說明:意向鎖定是InnoDB自動加的,不需要使用者介入。 對於UPDATE、DELETE和INSERT語句,InnoDB會自動將涉及資料集加上排他鎖(X)。 對於普通SELECT語句,InnoDB不會加上任何鎖定。

請求鎖定模式

 

  

S

IS

相容 相容 IS 衝突
兼容 兼容

InnoDB行鎖是透過給索引上的索引項加鎖來實現的,因此InnoDB這種行鎖實現特點意味著:只有透過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖。

    另外,事務可以透過以下語句明確地為記錄集加上共享鎖定或排他鎖。
  • 共享鎖定(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
  • 排他鎖(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
  • 用SELECT ... IN SHARE MODE取得共享鎖,主要用在需要資料依存關係時來確認某行記錄是否存在,並確保沒有人對這個記錄進行UPDATE或DELETE操作。但如果目前事務也需要對該記錄進行更新操作,則很有可能造成死鎖,對於鎖定行記錄後需要進行更新操作的應用,應該使用SELECT... FOR UPDATE方式獲得排他鎖。
以上就是MySQL事務、鎖定以及應用(二)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn