撩課-Mysql第16部分-事務併發/髒讀/幻讀/與隔離級別

事務的併發問題
1.髒讀
老闆要給程式員發工資,
程式設計師的工資是3.6萬/月。
但是發工資時老闆不小心按錯了數字,
按成3.9萬/月,
該錢已經打到程式設計師的戶口,
但是事務還沒有提交,
就在這時,
程式設計師去檢視自己這個月的工資,
發現比往常多了3千元,
以為漲工資了非常高興。
但是老闆及時發現了不對,
馬上回滾差點就提交了的事務,
將數字改成3.6萬再提交
實際程式設計師這個月的工資還是3.6萬,
但是程式設計師看到的是3.9萬。
他看到的是老闆還沒提交事務時的資料。
這就是髒讀。
解決辦法
Read committed!讀提交,能解決髒讀問題
2.不可重複讀
程式設計師拿著工資卡(卡里當然是只有3.6萬),
當他買單時(程式設計師事務開啟),
收費系統事先檢測到他的卡里有3.6萬,
就在這個時候!!
程式設計師的妻子要把錢全部轉出充當家用,
並提交。
當收費系統準備扣款時,
再檢測卡里的金額,
發現已經沒錢了。
程式設計師就會很鬱悶,
明明卡里是有錢的…
一個事務範圍內兩個相同的查詢
卻返回了不同資料,
這就是不可重複讀
解決辦法:
Repeatable read
3.重複讀
程式設計師拿著工資卡(卡里還是有3.6萬),
當他買時
(事務開啟,不允許其他事務的UPDATE修改操作),
收費系統事先檢測到他的卡里有3.6萬。
這個時候他的妻子不能轉出金額了。
接下來收費系統就可以扣款了。
4.幻讀
程式設計師某一天去消費,
花了2千元,
然後他的妻子去檢視他今天的消費記錄(,妻子事務開啟),
看到確實是花了2千元,
就在這個時候,
程式設計師花了1萬買了一部電腦,
即新增INSERT了一條消費記錄,
並提交。
當妻子列印程式設計師的消費記錄清單時(妻子事務提交),
發現花了1.2萬元,
似乎出現了幻覺,
這就是幻讀。
解決辦法:
Serializable
但是這種事務隔離級別效率低下, 比較耗資料庫效能, 一般不使用。
對應關係表:
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
序列化(serializable) | 否 | 否 | 否 |
事務隔離級別:
Read uncommitted
就是一個事務可以讀取另一個未提交事務的資料
Read committed
一個事務要等另一個事務提交後才能讀取資料
Repeatable read
就是在開始讀取資料(事務開啟)時,不再允許修改操作
Serializable
在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀
檢視隔離級別
select @@global.tx_isolation,@@tx_isolation;
設定隔離級別:
全域性的
set global transaction isolation level read committed;
當前會話
set session transaction isolation level read committed;