事物併發讀寫的可能:幻影讀-不可重複讀-髒讀

伴隨着事務的不同隔離等級,會出現不同的讀取現象。ANSI/ISO 標準 SQL 92指出兩個事務併發執行,一個事務讀數據,另一個事務寫數據時可能出現的三種情況。

  1. 幻影讀(Phantom reads)
    事務T1進行兩次相同的查詢,前後2次查詢的結果由於事務T2插入了新數據產生了不同的結果。
T1                                                                    T2
select * from account where balance > 100; 
                                                                        insert into account(balance) values(200);
                                                                        commit;
select * from account where balance > 100;
commit;

事務T1由於第二次查詢結果多了事務T2新插入的值,和第一次查詢時的結果不一致,多出了一條 balance = 200 的數據。
這種情況在低於串行化(Serializable)的隔離等級:可重複的讀(Repeatable Read), 讀已提交(Read Commited), 讀未提交(Read Uncommited)下會發生。

  1. 不可重複讀(None-repeatable reads)
    事務T1對同一數據進行兩次查詢,由於事務T2對相同數據的修改,導致事務T1前後兩次查詢結果
    不一致(不可重複)。
T1                                                                    T2
select * from account where id = 1; 
                                                                        update account set balance = 200 where id = 1;
                                                                        commit;
select * from account where id = 1;
commit;

假設事務T1第一次查詢後的結果balance = 100,由於事務T2的介入,第二次對同一數據的查詢將會得到和第一次不同的結果balance = 200。
這種情況在低於可重複讀(Repeatable Read的)隔離等級:讀已提交(Read Commited), 讀未提交(Read Uncommited)下會發生。

  1. 髒讀(Dirty reads)
    事務T1讀取到事務T2更新卻未提交的數據,隨後由於回滾或者更新覆蓋導致事務T1讀取到無效數據。
T1                                                                    T2
                                                                        update account set balance = 200 where id = 1;
select * from account where id = 1;
commit;
                                                                        rollback;

由於事務T2的緣故,事務T1將會讀取到 balance = 200 的結果,但是事務T2隨後進行了回滾,事務T1讀取了無效數據。
這種情況在低於讀已提交(Read Commited)的隔離等級:讀未提交(Read Uncommited)下會發生。

上訴三種情況,從下到上,爲了避免相應的情況發生,要求的隔離等級依次升高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章