DB使用的隔離級別不僅影響數據庫的並發性,而且影響並發應用程序的性能。通常,使用的隔離級別越嚴格,並發性就越小,某些應用程序的性能可能會隨之越低,因為它們要等待資源上的鎖被釋放。
|
Dirty Read 臟讀 |
NonRepeatable Read 不可重復讀 |
Phantom Read 幻讀 |
Read uncommitted 未提交讀 |
Possible |
Possible |
Possible |
Read committed 提交讀 |
Not possible |
Possible |
Possible |
Repeatable read 可重復讀 |
Not possible |
Not possible |
Possible |
Serializable 序列化 |
Not possible |
Not possible |
Not possible |
未提交讀隔離級別是最不嚴格的隔離級別,現實中應用很少。在使用這個隔離級別時,僅當另一個事務試圖刪除或更改被檢索的行所在的表時,才會鎖定一個事務檢索的行。因為在使用這種隔離級別時,行通常保持未鎖定狀態,所以臟讀、不可重復讀和幻像讀都可能會發生。
提交讀是Oracle默認的隔離級別,事務中的每一條語句都遵從語句級的讀一致性,即一個語句所處理的數據集是在單一時間點上的數據集,這個時間點是這個語句開始的時間,一個語句看不見在它開始執行后提交的修改
可重復讀是Mysql的默認隔離級別。在該隔離級別下,一個事務的影響完全與其他並發事務隔離,臟讀、不可重復的讀、幻像讀現象都不會發生。當使用可重復讀隔離級別時,在事務執行期間會鎖定該事務以任何方式引用的所有行。因此,如果在同一個事務中發出同一個SELECT語句兩次或更多次,那么產生的結果數據集總是相同的。因此,使用可重復讀隔離級別的事務可以多次檢索同一行集,並對它們執行任意操作,直到提交或回滾操作終止該事務。。
序列化讀會使整個數據庫的並發性能大幅下降,僅僅能看見在本事務開始前由其它事務提交的更改和在本事務中所做的更改,接近於串行操作,現實中應用很少。
臟讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。
非重復讀(nonrepeatable read):同一查詢在同一事務中多次進行,由於其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重復讀。
幻讀(phantom read):同一查詢在同一事務中多次進行,由於其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀