天天看點

MySQL 事務的隔離級别

​​    mysql 事務的隔離級别    ​​

MySQL 事務的隔離級别

介紹mysql5.6中事務的acid特性、隔離級别以及髒讀、不可重複讀和幻讀等内容

1. 事務的acid

事務的acid是指事務擁有的4個特性的首字母組合:atomicity(原子性), consistency(一緻性), isolation(隔離性)和durability(持久性)。

①atomicity(原子性):表示事務是一個不可分割的工作單元,要麼在送出事務後所有更改成功,要麼在復原事務時撤消所有更改,不可以隻執行其中的一部分操作。

②consistency(一緻性):在每次送出、復原之後或正在進行的事務,資料庫始終保持一緻狀态。如正在跨多個表更新相關資料,則查詢看到的将是所有舊值或所有新值,而不是新值和舊值的混合。

③isolation(隔離性):事務在進行過程中互相隔離,他們不能互相幹擾,也不能看到彼此的未送出資料。但可以通過修改隔離級别,檢視其他事務正在處理的資料。

④durability(持久性):事務送出成功後,該事務所做的更改将會儲存在資料庫中。

2. 并發讀取資料的問題

當事務讀取另一個事務已修改的資料時,可能會發生dirty read(髒讀)、non-repeatable read(不可重複讀)和phantom read(幻讀)之類的現象。

①dirty read(髒讀):目前事務讀取了另一個事務已更新但尚未送出的資料。後果就是另一個事務復原了,此資料就為錯誤的無效資料。

②non-repeatable read(不可重複讀):目前事務讀取相同資料2次的過程期間,另一個事務修改了此資料并送出,造成目前事務讀取的2次結果不一緻。

③phantom read(幻讀):目前事務讀取相同資料2次的過程期間,另一個事務插入了新行或更新一行以此造成目前事務讀取的2次結果不一緻。看上不可重複讀與幻讀兩者差不多,但不可重複讀偏向于行的修改,幻讀偏向于行的新增。

3. 隔離級别

隔離級别是一種用于在多個事務同時進行更改和執行查詢時修改事務隔離性(isolation)的設定,權衡事務的保護以提高性能和并發性。

innodb儲存引擎支援的隔離級别有(從低到高): read uncommitted(未送出讀)、 read committed(已送出讀)、repeatable read(可重複讀) 和 serializable(可串行話)。

說明:為最低的隔離級别,表示目前事務可以讀取其他事務已修改但未送出的資料。這個級别會導緻很多問題,通常,具有此隔離級别的事務僅執行查詢,而不執行插入,更新或删除操作。

說明:事務無法看到來自其他事務未送出的資料,簡單來講一個事務從開始直到送出前,所做的任何修改對其他事務而言是不可見的。

說明:innodb的預設隔離級别。保證了在同一個事務内多次讀取同樣的記錄的結果為一緻。

說明:為最高的隔離級别,表示事務一個接一個的串行執行,通路同一資源時,後面的事務必須等待前面的事務操作完成後才能進行操作。

4. 總結

不同的隔離級别解決髒讀、不可重複讀和幻讀的問題也不一樣,關系如下:

<col>

隔離級别

dirty read(髒讀)

non-repeatable read(不可重複讀)

phantom read(幻讀)

read uncommitted(未送出讀)

未解決

read committed(已送出讀)

已解決

repeatable read(可重複讀)

serializable(可串行化)

兩者的主要差別在于不可重複讀的政策。

例如事務a讀取了2次行r1,在讀取2次期間事務b對行r1進行了修改,那麼:

當隔離級别為read committed(已送出讀)時:事務a讀取2次行r1的資料不一樣。

當隔離級别為repeatable read(可重複讀)時:事務a讀取2次行r1的資料一樣。

5. 參考資料

髒讀、不可重複讀和幻讀:​​https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_read_phenomena​​

隔離級别:​​https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_isolation_level​​

繼續閱讀