通過設置事務的隔離級別
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
