目錄
鎖的型別 行級鎖 / 意向鎖 (一種表級鎖)
一致性非鎖定讀(innodb儲存引擎的預設設定)
行鎖的3種演算法 死鎖
innodb儲存引擎實現了如下兩種標準的行級鎖
1)共享鎖(s lock),允許事務讀一行資料。(select column from table ... lock in share mode)
2)排他鎖(x lock),允許事務刪除或更新一行資料。 (select column from table ... for update)
為了支援多粒度加鎖,還引入了意向鎖的概念,其意向鎖即為表級別的鎖
3)意向共享鎖(is lock),事務想要獲得一張表中某幾行的共享鎖
4)意向排他鎖(ix lock),事務想要獲得一張表中某幾行的排他鎖
由於innodb儲存引擎支援的是行級別的鎖,因此意向鎖其實不會阻塞除全表掃以外的任何請求。故表級意向鎖與表級鎖的相容性如下表所示:
之所以稱其為非鎖定讀,因為不需要等待訪問的行上x鎖的釋放 而是去讀取乙份快照資料,快照資料是指該行的之前版本的資料,該實現是通過undo段來完成。而undo用來在事務中回滾資料,因此快照資料本身是沒有額外的開銷。此外,讀取快照資料是不需要上鎖的,因為沒有事務需要對歷史的資料進行修改操作。
mvcc(多版本併發控制)
在事務隔離級別read committed和repeatableread(innodb儲存引擎的預設事務隔離級別)下,innodb儲存引擎使用非鎖定的一致性讀。然而,對於快照資料的定義卻不相同。在read committed事務隔離級別下,對於快照資料,非一致性讀總是讀取被鎖定行的最新乙份快照資料。而在repeatable read事務隔離級別下,對於快照資料,非一致性讀總是讀取事務開始時的行資料版本
如果需要一致性鎖定讀可以採用加鎖的方式。
innodb儲存引擎有3种行鎖的演算法,其分別是:
record lock:單個行記錄上的鎖
gap lock:間隙鎖,鎖定乙個範圍,但不包含記錄本身
next-key lock∶gap lock+record lock,鎖定乙個範圍,並且鎖定記錄本身
在預設的事務隔離級別下,即repeatable read下,innodb儲存引擎採用next-key locking機制來避免phantom problem(幻像問題)。這點可能不同於與其他的資料庫,如oracle資料庫,因為其可能需要在serializable的事務隔離級別下才能解決phantom problem。
phantom problem是指在同一事務下,連續執行兩次同樣的sql語句可能導致不同的結果,第二次的sql語句可能會返回之前不存在的行。
死鎖是指兩個或兩個以上的事務在執行過程中,因爭奪鎖資源而造成的一種互相等待的現象。
當前資料庫還都普遍採用wait-for graph(等待圖)的方式來進行死鎖檢測
1.ab-ba死鎖
2.此外還存在另一種死鎖,即當前事務持有了待插入記錄的下乙個記錄的x鎖,但是在等待佇列中存在乙個s鎖的請求,則可能會發生死鎖
這個問題的產生是由於會話b中請求記錄4的s鎖而發生等待,但之前請求的鎖對於主鍵值記錄1、2都已經成功,若在事件點5能插入記錄,那麼會話b在獲得記錄4持有的s鎖後,還需要向後獲得記錄3的記錄,這樣就顯得有點不合理。因此innodb儲存引擎在這裡主動選擇了死鎖
注:來自於《mysql技術內幕》
mysql InnoDB儲存引擎
innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...
Mysql Innodb儲存引擎
鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...
MYSQL INNODB 儲存引擎
innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...