天天看點

【MySQL鎖之】InnoDB存儲引擎及其鎖機制

首先要解決的一個誤區就是:InnoDB存儲引擎是基于事務的。而前面博文所講的MyISAM存儲引擎是不支援事務的。那麼什麼是基于事務的呢?複制過來一段我覺得講得還不錯的話:

在預設的情況下,MySQL從自動送出(autocommit)模式運作,這種模式會在每條語句執行完畢後把它作出的修改立刻送出給資料庫并使之永久化。事實上,這相當于把每一條語句都隐含地當做一個事務來執行。如果你想明确地執行事務,需要禁用自動送出模式并告訴MySQL你想讓它在何時送出或復原有關的修改。執行事務的常用辦法是發出一條START TRANSACTION(或BEGIN)語句挂起自動送出模式,然後執行構成本次事務的各條語句,最後用一條COMMIT語句結束事務并把它們作出的修改永久性地記入資料庫。萬一在事務過程中發生錯誤,用一條ROLLBACK語句撤銷事務并把資料庫恢複到事務開始之前的狀态。START TRANSACTION語句"挂起"自動送出模式的含義是:在事務被送出或復原之後,該模式将恢複到開始本次事務的START TRANSACTION語句被執行之前的狀态。(如果自動送出模式原來是激活的,結束事務将讓你回到自動送出模式;如果它原來是禁用的,結束目前事務将開始下一個事務。)如果是autocommit模式  ,autocommit的值應該為 1;請在試驗前 确定autocommit 的模式是否開啟 。

1、事務及其ACID屬性

原子性,隔離性,持久性,一緻性

2、并發事務處理帶來的問題

更新丢失:一個事物覆寫了另一個事務的更新

髒讀:一個事物讀到了另一個事務未送出的資料。

不可重複讀:一個事物的兩次讀期間,另一個事務改變了值

幻讀:一個事物兩次讀期間,另一個事務插入新的資料。

3、事物的隔離級别

髒讀,不可重複讀,幻讀都是資料庫讀一緻性問題,必須由資料庫提供一種事務隔離機制來解決。資料庫實作事務隔離的方式,有兩種:

一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。

一種是不加鎖,通過生成一個資料請求時間點的一緻性資料快照,并用這個快照來提供一定級别的一緻性讀取。這種技術叫做資料多版本并發控制,也經常成為多版本資料庫(MVCC)

未送出讀,已送出讀,可重複讀,可序列化

4、InnoDB的行鎖模式及其加鎖方法

InnoDB中有以下兩種類型的行鎖:共享鎖和排他鎖。

對于update,insert,delete語句,InnoDB會自動給設計的資料集加排他鎖。對于普通的select語句,InnoDB不會加任何鎖。

事物可以通過以下語句顯示給記錄集加共享鎖和排他鎖。

共享鎖:select * from 。。。。。 lock in share mode

排它鎖:select * from .......... for update

【MySQL鎖之】InnoDB存儲引擎及其鎖機制
【MySQL鎖之】InnoDB存儲引擎及其鎖機制
【MySQL鎖之】InnoDB存儲引擎及其鎖機制
【MySQL鎖之】InnoDB存儲引擎及其鎖機制
【MySQL鎖之】InnoDB存儲引擎及其鎖機制

5、InnoDB行鎖的實作方式

InnoDB行鎖是通過給索引上的索引項加鎖來實作的,如果沒有索引,InnoDB将通過隐藏的聚簇索引來對記錄加鎖。InnoDB這種行鎖實作特點意味着:如果不通過索引條件檢索資料,那麼InnoDB将對表中的所有記錄加鎖,實際效果跟表鎖一樣。

(1)在不通過索引條件查詢時,InnoDB會鎖定表中的所有記錄。

(2)Mysql的行鎖是針對索引加的鎖,不是針對記錄加的鎖,是以雖然是通路不同行的記錄,但是如果使用相同的索引鍵,是會出現沖突的。

【MySQL鎖之】InnoDB存儲引擎及其鎖機制

(3)當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,但都是通過行鎖來對資料加鎖。

【MySQL鎖之】InnoDB存儲引擎及其鎖機制

(4)Next-key鎖(間隙鎖)

可以防止幻讀和滿足恢複和複制的需要

【MySQL鎖之】InnoDB存儲引擎及其鎖機制

繼續閱讀