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