1. 程式人生 > >撩課-Mysql第16部分-事務併發/髒讀/幻讀/與隔離級別

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

學習地址:
撩課-JavaWeb系列1之基礎語法-前端基礎
撩課-JavaWeb系列2之XML
撩課-JavaWeb系列3之MySQL
撩課-JavaWeb系列4之JDBC
撩課-JavaWeb系列5之web伺服器-idea

事務的併發問題

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;