資料庫隔離級別分析

2021-09-25 10:58:36 字數 1066 閱讀 6938

1. read uncommitted 讀取未提交資料:如果使用者a正讀取表t1,使用者b對錶t1作出修改但未提交,當使用者a再次讀取t1時,可以讀到修改的資料。是隔離級別最低的情況,讀取到未提交的資料,會造成髒讀問題。

2. read committed 讀取已提交資料:如果使用者a正讀取表t1,並對t1作出修改,然後使用者b再讀取表t1,讀取的資料不會改變,接著使用者a將修改提交,使用者b再次讀取將讀取出已修改資料。兩次讀取結果不同,造成不可重複讀問題。

3. repeatable read 可重複讀:使用者b讀取表t1,此時使用者a在表中新增一行資料,使用者b再次讀取不會讀取到a新增的資料,但是當b嘗試新增一條資料會提示資料重複。資料已經發生改變了仍要求保持一致,出現幻讀問題。

4. serializable 可序列化:使用者b讀取表t1資料,此時使用者a嘗試向t1寫入資料,使用者a將陷入等待,直到使用者b提交修改。隔離級別最高,會對效能造成影響,實際應用時需要根據需要選擇合適的。

1. 可重複讀底層原理:

mysql的可重複讀是通過innodb的mvcc(多版本併發控制)實現的。

首先,可重複讀指乙個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(早於本事務開始且已提交),但是不能看到其他事務對已有記錄的更新(晚於本事務開始)。

使用mvcc,innodb為每行記錄新增乙個版本號,每當修改資料時,版本號+1。在事務讀取開始時,系統會給事務分配乙個當前的版本號,事務會讀取版本號<=當前版本號的所有資料,只要是版本號》當前版本號的資料都不會被讀取。

2. mysql可重複讀如何避免幻讀?

mysql支援三種行鎖定方式:

- 行鎖(record lock):在索引記錄上加鎖;

- 間隙鎖(gap lock):在不存在的空閒空間加鎖;

- next-key lock:行鎖與間隙鎖的組合。

innodb預設工作在可重複讀級別,以next-key lock的方式對資料進行加鎖,具體步驟為:當掃瞄行記錄時,對選中的索引記錄上加行鎖;對索引記錄兩邊的空隙加上間隙鎖(這樣其他事務不能在這個間隙中插入資料)。這樣便有效避免了幻讀現象。

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...