注意:只是個人理解的手記,不具備權威準確性
mysql事務基本要素和隔離級別
一.事務的四個基本要素
1.原子性:事務中的操作要麼都執行,要麼都回滾
2.一致性:A和B存款各位500,相互轉賬總額保持1000不變,對開發者有要求,不能寫出錯誤邏輯
3.隔離性:多事務併發時,保證各事務處理互不干擾,有四個隔離級別,在併發和干擾之間權衡(需要深入學習鎖知識)
4.持久性:事務一旦提交,數據一定持久化到數據庫,不可回滾,除非執行相反操作事務,mysql通過日誌實現的.
二.事務的隔離級別
1.讀取未提交
A事務會讀取到B事務未提交的更新內容
缺點:如果B回滾了,A會讀取到B的中間狀態,可造成髒讀
2.讀取已提交
A事務可以讀取到B事務提交的更新內容,
優點:因爲只可以讀B提交的內容,所以解決了1中的髒讀問題
缺點:A事務前後查詢的結果可能不一致,可造成不可重複讀
3.可重複讀
A事務讀取的記錄總是第一次查詢的快照,無論B事務提交更新,都不會影響A的查詢結果
優點:因爲A讀取的都是第一次查詢的快照,所以解決了2中不可重複讀的問題,也不會出現1髒讀
缺點:B事務插入的新記錄A中是查詢不到的,但是A事務進行的增刪改會讀取最新記錄,可造成幻讀
擴展:可重複讀下間隙鎖(Gap Lock)可以鎖定一個範圍,防止數據插入避免部分幻讀(需要繼續深入學習鎖知識)
4.串行化
A查詢數據,B可以查詢數據,但是B不可以再增刪改數據
優點:避免了3中的幻讀,當然1的髒讀和2的不可重複讀也不會出現
缺點:增刪改無併發
三.不同隔離性引發的問題
髒讀:讀到了別人未提交的內容
不可重複讀:讀到了別人update的內容
幻讀:未讀到別人insert或delete的內容,但是增刪改時卻存在
四.操作
1.查看全局和當前會話隔離級別
select @@global.tx_isolation, @@tx_isolation;
2.設置全局或當前會話隔離級別
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}