MySQL事务隔离级别及演示
目錄
事務的概述
事務的隔離級別
事務的隔離級別的演示:演示臟讀
事務的隔離級別的演示:避免臟讀和不可重復讀的發生
事務的隔離級別的演示:避免不可重復讀
事務的隔離級別的演示:演示串行化
事務的概述
a、開啟事務、提交事務:
b、開啟事務,回滾事務:
3. 事務的四大特性:
原子性:組成事務的最小單元是不可分割的,要么同時成功要么同時失敗。
一致性:執行事務前后,數據的完整性是一致的;(也就是案例中總錢數是一樣的)
隔離性:在數據庫中,各個事務之間是獨立的額,不受其他事務的影響。
持久性:事務一旦結束,數據就會序列化到數據庫中。
事務的隔離級別
? ? ? ? ? ?臟讀:一個事務讀到了另一個事務未提交的數據。
不可重復讀:一個事務讀到了另一個事務已經提交的update數據
虛讀/幻讀:一個事務讀到了另一個事務已經提交的insert數據
事務的隔離級別
read?uncommitted :臟讀,不可重復讀,虛讀都有可能發生
read?committed :避免臟讀。但是不可重復讀和虛讀是有可能發生
repeatable-read :避免臟讀和不可重復讀,但是虛讀有可能發生。(mysql默認隔離級別)
serializable :避免臟讀,不可重復讀,虛讀。
從上到下級別越來越高,但是效率越來越低。
事務的隔離級別的演示:演示臟讀
設置事務隔離級別:SET?SESSION?TRANSACTION?ISOLATION?LEVEL?隔離級別;
查看事務的隔離級別:select?@@tx_isolation;
演示思路:
事務的隔離級別的演示:避免臟讀和不可重復讀的發生
演示思路:
1、 開啟兩個窗口A和B;
2、 設置A窗口的隔離:SET?SESSION?TRANSACTION?ISOLATION?LEVEL?read?uncommitted;
3、 在A和B兩個窗口中開啟事務
4、 在B窗口完成轉賬操作,但不提交事務。
5、 在A窗口查詢表數據,會發現沒有轉賬成功,也就是說沒有查詢到另一個事務未提交的數據,避免了“臟讀”;
6、在B窗口提交事務,
7、在A窗口查詢數據,會發現兩次數據不一樣,也就發生了“不可重復讀”
事務的隔離級別的演示:避免不可重復讀
演示思路:
1、 開啟兩個窗口A和B;
2、 設置A窗口的隔離:SET?SESSION?TRANSACTION?ISOLATION?LEVEL?repeatable-read;
3、 在A和B兩個窗口中開啟事務
4、 在B窗口完成轉賬操作,但不提交事務。
5、 在A窗口查詢表數據,會發現沒有轉賬成功,也就是說沒有查詢到另一個事務未提交的數據,避免了“臟讀”;
6、在B窗口提交事務,
7、在A窗口查詢數據,會發現兩次數據一致,也就說避免了“不可重復讀”
事務的隔離級別的演示:演示串行化
演示思路:
1、 開啟兩個窗口A和B;
2、 設置A窗口的隔離:SET?SESSION?TRANSACTION?ISOLATION?LEVEL?serializable;
3、 在A和B兩個窗口中開啟事務
4、 在B窗口中插入一條記錄,但不提交事務。
5、 在A窗口查詢表數據,發現A窗口已經卡住了(說明事務不允許出現并發,A窗口需要等待B窗口事務執行完成以后,才會執行A窗口的事務。)當B窗口的事務結束(提交或者回滾),那么A窗口馬上就會出現結果。
總結
以上是生活随笔為你收集整理的MySQL事务隔离级别及演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程--使用future进行异
- 下一篇: MySQL多表与分组练习题及答案