一、事務簡介
事務是一組操作的集合,它是一一個不可分割的作業單位,事務會把所有的操作作為- -個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗,
二、有關事務操作
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才能夠完成插入操作
這種阻塞的效果有效的避免了幻讀問題,證實了串行化隔離級別解決了幻讀問題
總結:實際使用還得根據業務本身去設定隔離級別,隔離級別最高性能也最差,隔離級別低的性能較好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/439189.html
標籤:MySQL
