mysql事務、隔離級別
一、事務簡介
事務是一組操作的集合,它是一一個不可分割的工作單位,事務會把所有的操作作為- -個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。
二、有關事務操作
mysql中的事務是默認的自動提交的,我們可以手動的去關閉 或者開啟事務
#查看事務是否自動提交 select @@autocommit; # 等於1 默認自動提交 #設置事務提交方式 set @@autocommit = 0; # 關閉自動提交事務 #也可以直接設置開啟事務 start transaction ; #或著 begin ; #提交事務 如果業務操作正常完成就提交事務 commit ; #回滾事務 如果業務操作在執行過程中出現異常 回滾事務保證事務的完整性和正確性 rollback ;
三、事務的四大特性(ACID)
原子性(Atomicity) : 事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。
一致性 (Consistency) : 事務完成時,必須使所有的數據都保持一致狀態。
隔離性(Isolation) : 資料庫系統提供的隔離機制,保證事務在不受外部並發操作影響的獨立環境下運行。
持久性(Durability) : 事務一旦提交或回滾,它對資料庫中的數據的改變就是永久的。
四、並發事務問題
1、臟讀
一個事務讀到另一個事務還沒有提交的事務。
2、不可重複讀
一個事務先後讀取同一條記錄,但兩次讀取的數據不同。
3、幻讀
一個事務在按照條件查詢數據時,沒有這條數據,但是在插入數據時卻又發現有這條數據已經存在,好像出現了「幻覺」。
五、事務的隔離級別
1、讀未提交(Read uncommitted)
可能出現:臟讀、不可重複讀、幻讀;隔離級別最差,性能最高。
2、讀已提交(Read committed)
可能出現:不可重複讀、幻讀。
3、可重複讀(Repeatable Read(mysql的默認隔離級別))
可能出現:幻讀。
4、串列化(Serializable)
上述並發問題都可解決,隔離級別最高,但是性能最差。
#查看事務隔離級別 select @@transaction_isolation; # REPEATABLE-READ #設置事務的隔離級別 set session transaction isolation level read uncommitted ; set session transaction isolation level read committed ; set session transaction isolation level repeatable read ; set session transaction isolation level serializable ;
場景一
在idea中開啟兩個控制台,設置事務級別為 讀未提交隔離級別 並開啟事務
控制台1 第一次查詢
控制台2 執行如下語句 未提交
控制台1 再次查詢
可見在控制台2執行更新操作後,還沒提交,控制台1再次執行查詢操作時,查詢到的數據已經改變了,證實了讀未提交發生臟讀現象。
場景二
在idea中開啟兩個控制台,設置事務級別為 讀已提交隔離級別 並開啟事務
控制台1 第一次查詢
控制台2 執行如下語句 未提交
控制台1 再次查詢
證實了事務的隔離級別設置為讀已提交解決了臟讀問題
場景三
在idea中開啟兩個控制台,設置事務級別為 讀已提交 並開啟事務
控制台2 執行如下語句 未提交
控制台1 第一次查詢
控制台2 執行commit提交後 控制台1 再次查詢結果不同
可見在控制台1在一次事務中,在控制台2更新前後查詢到的數據不同,證實了讀已提交發生了不可重複讀問題
場景四
在idea中開啟兩個控制台,設置事務級別為 可重複讀隔離級別 並開啟事務
控制台2 執行如下語句 未提交
控制台1 第一次查詢
控制台2 執行commit提交後 控制台1 再次查詢結果相同
可見在控制台1在一次事務中,在控制台2更新前後查詢到的數據不同,證實了可重複讀隔離級別解決了不可重複讀問題
場景五
在idea中開啟兩個控制台,設置事務級別為 可重複讀隔離級別 並開啟事務
控制台1 第一次查詢 為空
控制台2 執行插入 並提交
控制台1 執行相同的插入sql 發現已經存在 於是就查詢,但是又查不到數據
對於控制台1來說就像是「幻覺」一樣,證實了可重複讀隔離級別發生了幻讀問題
場景六
在idea中開啟兩個控制台,設置事務級別為 串列化隔離級別 並開啟事務
控制台1 執行查詢 為空
控制台2 執行插入 可見操作阻塞
控制台1提交事務後,控制台1才能夠完成插入操作
這種阻塞的效果有效的避免了幻讀問題,證實了串列化隔離級別解決了幻讀問題
總結:實際使用還得根據業務本身去設置隔離級別,隔離級別最高性能也最差,隔離級別低的性能較好。