資料庫 隔離級別

2021-08-01 22:28:36 字數 824 閱讀 8645

先介紹下併發環境下事務執行可能發生的錯誤:

1.寫覆蓋:乙個事務執行時,最後需要寫回資料a,在這期間,另乙個事務讀取了未寫回的資料項a,然後也更新了a。那麼最後a只可能為兩個事務更新的值中的乙個,另乙個更新就丟失了。更新乙個未提交的值,會覆蓋別人的更新。

2.髒讀:讀取了未提交的值,與寫覆蓋比較容易混淆,髒讀指的是,乙個事務中有乙個寫操作修改了值,但是這個事務還有後續的操作,沒有提交,然後另乙個事務讀取了這個修改以後的值,最後前面的事務因為錯誤回滾了,那麼後乙個事務讀取的值就沒有意義了,是乙個錯誤的值。所以需要等前乙個事務提交以後再讀取。髒讀與寫覆蓋的區別在於另乙個事務是在修改之前還是之後運算元據的。

3.重複讀:指的是乙個事務需要讀乙個資料兩次,在讀取期間,另乙個事務修改了這個值,最後導致兩次讀取的值不同。

4.幻讀:幻讀發生在資料插入過程,針對的是乙個資料的集合。對這個集合的操作正好忽略了剛插入的資料。

以上都是事務並行執行時可能發生的錯誤。所以需要隔離事務。隔離的級別越高,並行的效率越低,因此資料庫可以設定隔離級別。

mysql預設的隔離級別是重複讀。

應用程式提交到mysql服務的事務,其實可以理解為執行的程式,有的是計算,有的是io,因此事務是可以並行的,當然這是巨集觀的,微觀可能是幾個io執行緒級別的並行。隔離級別就是控制事務的並行程度的。

read uncommitted:只能避免寫覆蓋;當乙個事務讀時,別的事務在寫這個資料時可以不提交就讀。

read committed:還可以避免髒讀;事務讀時,別的事務必須寫完才可以,只能讀提交的值。

repeatable read:還可以避免重複讀;

序列化:都可以避免;

關於隔離級別,參見:

資料庫隔離級別

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...