MySQL中的事務隔離級別

2021-09-28 15:44:18 字數 2666 閱讀 7475

概述

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted(讀未提交) 、read committed(讀已提交) 、repeatable read(可重複讀取、系統預設的隔離級別) 、serializable(序列化) 。而且,在事務的併發操作中可能會出現資料更新丟失、髒讀、不可重複讀、幻讀。下面做詳細介紹。

事務隔離級別的概念

1、特點:在同一時間有兩個或者多個事務同時繼續, 同時操作同乙份資料

2、隔離級別分類:未讀提交、已讀提交、可重複讀、序列化。如下圖所示:

3、設定以及修改隔離級別

show variables like '%iso%';

局 @@session

全 @@global

set @@session.tx_isolation = 'read-committed';

set @@session.tx_isolation = 'repeatable-read';

事務使用時的問題

1、資料更新丟失(又被稱為事務級聯回滾。除了序列化隔離級別沒有此問題,其他隔離級別都有的問題)

有兩個或多個事務(假設abc三個事務)同時操作user表裡面的的一條記錄,具體業務如下:abc同時查詢id為10的一條資料,如果這條資料存在,就做相應的修改操作。

a查詢資料存在,修改值,

b查詢資料存在,修改值

c查詢資料存在,修改值

abc都查詢資料存在,並且也做了相應的修改,但是沒有提交事務,鎖沒有釋放。

此時,事務a(或b或c其中乙個)在沒有提交之前,發生了異常,導致事務回滾,這樣會導致另外兩個事務也發生異常回滾,另外兩個事務之前做的修改值操作部生效。

這就是級聯回滾。

導致這種問題的根本原因是事務的原子性,因為三個事務操作的都是同一條資料,所以三個事務被聯絡在了一起。

備註:級聯回滾不是mysql的功能,是開發人員為了保證程式的安全而做的處理。也是人為的手動處理的2、髒讀:乙個事務讀取了乙個另乙個事務未提交的資料,就是髒讀。事務a讀取了事務b更新的資料,然後b回滾操作(未提交的資料),那麼a讀取到的資料是髒資料。

解決方案:read committed!讀提交,能解決髒讀問題。

3、不可重複讀:乙個事務範圍內兩個相同的查詢卻返回了不同資料,這就是不可重複讀。事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

解決方案:repeatable read !(可重複讀)不可重複讀對應的是修改,即update操作。

4、幻讀:和不可重複讀相比,幻讀對應的是插入insert操作,而不是update操作。事務 a 全表掃瞄讀取資料,事務 b 在事務a讀取的過程中,對資料作了插入操作並提交,導致事務a讀取資料時,多出了一條記錄,好像產生了幻覺。

解決方案:1、序列化。2、加一把排他鎖,間隙鎖

讀未提交

1、就是乙個事務可以讀取另乙個未提交事務的資料。

2、問題:容易產生髒讀(讀了未提交的資料)

讀已提交

1、就是乙個事務要等另乙個事務提交後才能讀取資料。

2、產生問題:a事務修改了資料,b事務在a事務修改資料之前和修改資料之後兩次讀的資料不一致。

repeatable read(可重複讀、資料庫預設級別)

1、可重複讀,就是在開始讀取資料(事務開啟)時,不再允許修改操作。

2、產生問題:可重複讀,雖然不允許修改,但是可以插入資料,這就容易產生幻讀。

序列化1、serializable 是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

事務隔離級別和鎖的關係

1.讀未提交:a事務可以讀取b事務修改但是未提交的資料,容易產生髒讀。

鎖原理:其實就是加了一把共享鎖,不允許其他事務寫,但是可以讀。
2、讀已提交:a事務不可以讀取b事務修改但是未提交的資料。主要是解決髒讀問題(但是容易產生 不可重複讀問題,未修改前和修改後的資料不一致)。

鎖原理:和上面的一樣,也是加了一把共享鎖,只不過只有a事務修改資料並且提交資料,b事務才可以讀資料。容易產生不可重複讀問題:a事務提交前和提交後修改了資料,導致b事務兩次讀的資料結構不不一致。
3、可重複讀取:事務a一旦開啟了事務,就不允許其他事務做修改操作。但是,允許插入操作。容易產生幻讀。

4、序列化:就是乙個乙個排隊。類似佇列。『

鎖原理:就是加了一把排他鎖,既不允許其他事務讀,也不允許其他事務寫.。
一般不使用此隔離級別,效能差。遇到幻讀問題一般用樂觀鎖實現,比如佇列。

總結

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL中的事務隔離級別

sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些不希望發生的現象是 乙個事務讀取了另乙個未提交的並行事務寫的資料。乙個事務重新讀取前面讀取過的資料,發現該資料已經被另乙個已提交的事務修改過。乙個事務重新執行乙個查詢,返回一套符合查詢條件的行,發現這些行因為其他最近提交的...

MySQL中的事務隔離級別

mysql中的事務隔離級別 收藏 sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些不希望發生的現象是 髒讀 dirty reads 乙個事務讀取了另乙個未提交的並行事務寫的資料。不可重複讀 non repeatable reads 乙個事務重新讀取前面讀取過的資料,發現...