天天看點

資料庫事務的四種隔離級别資料庫事務的四大特性資料庫事務的隔離級别資料庫預設的事務

資料庫事務的四大特性

原子性

事務包含的所有操作要麼成功,要麼失敗復原
           

一緻性

事務必須是資料庫從一個一緻性狀态到另一個一緻性狀态。
事務執行之前和之後必須都是一緻性的一個狀态
           

隔離性

當多個使用者并發通路資料庫,比如同一張表時,資料庫為每一個使用者開啟的事務,
不會被其他事務的操作幹擾,多個并發事務之間要互相隔離
           

持久性

事務一旦被送出,那麼資料庫的資料改變是永久性的,即便是資料庫遇到故障的時候也不會丢失事務操作。
           

資料庫事務的隔離級别

資料庫有4中事務隔離級别,分别從低到搞為:

Read uncommitted(讀,未送出)
Read committed(讀,已送出)
Repetablead(可重複讀)
Serializable(序列化又名串行化)
           

讀、未送出(Read uncommitted)

一個事務可以讀取到另一個未送出事務的資料
解決--髒讀
           

例:a轉給b 500元,a已經下發,但是沒有送出,此時b可以檢視到到了500,a由于未送出事務,此時測回,可導緻a已經見到500到賬,但是又沒有了。

此時就可使用Read committed(讀、已送出)解決資料髒讀問題。
           

讀、已送出(Read committed)

事務要等待另一個事務送出後才能讀取資料。
解決--不可重複讀
           

例:a事務要進行扣款(之前已經讀取過資料),但是b事務正在進行中,需要等待b事務進行處理完成,直到b事務處理完成之後,b事務結束,此時a事務才能重新繼續處理,然而此時就需要重讀資料,導緻資料不正确。

讀送出的時候,需要等到其他update操作完成才能讀取資料,可以解決髒讀問題,
但是這裡一個事務範圍内兩個相同的查詢傳回了不同的資料,這個就是不可重複讀。
           

重複讀(Repeatable read)

重複讀,就是在開始讀取資料(事務開啟)時,就不再允許修改操作,MySQL是這一級别的。
解決--重複讀
           

a事務進行扣款(開啟重複讀事務),此時b事務就無法對資料進行處理,需要等待a事務處理完成之後再次進行資料處理。

重複讀可以解決不可重複讀的問題,其實不可重複讀就是針對update操作的。
但是可能會出現幻讀問題,**幻讀**是針對insert操作。
           

什麼是幻讀?

是a事務在開啟了重複讀的時候,b插入了一條資料,此時可能會出現資料幻讀。因為重複讀隻針對update操作,幻讀是針對insert操作。

序列化(Serializable)

解決幻讀
序列化時最高的事務隔離級别,在該級别下,事務串行順序執行,可以避免髒讀、不可重複讀、幻讀。
但是這種事務隔離級别效率底下,比較消耗資料庫性能。
           

資料庫預設的事務

大多數資料庫的事務隔離級别是Read committed
           
資料庫 預設事務級别
Sql Server Read committed(讀、已送出)
Oracle Read committed(讀、已送出)
MySQL Repeatable(可重複讀)