如何避免事務的並發問題?


 

通過設置事務的隔離級別
v代表未解決,x代表已解決


                          臟讀          不可重復讀       幻讀
                          
    1、READ UNCOMMITTED     √            √               √
    
    2、READ COMMITTED       x             √               √
    
    3、REPEATABLE READ      x            x               √                  
    
    4、SERIALIZABLE(串行化) x            x            x

 

詳解:

Read uncommitted

A事務可以讀取未提交事務B的數據

會出現的問題:

臟讀: B事物修改數據a=1,但是沒有提交,A事物讀取數據a=1,A事物拿到數據后顯示,此時B事物回滾,再次修改數據a=2,然后提交,所以實際數據a=2,但是A事物拿到的是a=1.

 

Read committed

A事務要等B事務提交后才能讀取數據

會出現的問題:

不可重復讀:A事物讀取a=1,A事物再次讀取a,此時B事物修改了a=2, A事物等待B提交后讀取a,此時a=2,一個事務范圍內兩個相同的查詢卻返回了不同數據.

 

Repeatable read

重復讀,就是在A事物開始讀取數據(事務開啟)時,B事物不被允許修改操作(修改對應的是UPDATE操作)

A事物讀取數據a=1, 此時B事物將不被允許修改數據a,直到A事物執行完畢,B事物才可以執行修改數據a.

會出現的問題:

幻讀:A事物讀取整個表的總金額a,由於Repeatable read對應的是update操作,所以insert新的數據時,兩個事物可以同時進行,這會導致A事物再次查詢時,數據a發生了變化.

 

Serializable 序列化

Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

 

 

大多數數據庫默認的事務隔離級別是Read committed,比如Sql Server , Oracle。

Mysql的默認隔離級別是Repeatable read。

 

參考:

https://www.cnblogs.com/ubuntu1/p/8999403.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM