1、事務(wù)的認(rèn)識(shí)
事務(wù):事務(wù)就是將多個(gè)SQL給打包在一起,組成一個(gè)整體。組成這個(gè)整體的各個(gè)SQL,要么全部成功,要么全部失敗。
舉例說(shuō)明:
情人節(jié)到了,滑稽老鐵打算給他女朋友小美發(fā)給紅包,但是他又害怕小美不收,于是他想到了一個(gè)辦法就是通過(guò)銀行卡進(jìn)行轉(zhuǎn)賬。他給小美轉(zhuǎn)賬了 520 元,那么滑稽老鐵的銀行卡余額就得 -520 元,小美的銀行卡余額 +520 元。這些操作就組成一個(gè)整體,就變成了事務(wù),要么執(zhí)行,要么就一個(gè)都不執(zhí)行。

如果中間出錯(cuò)了,就一條都不執(zhí)行。這里的一條都不執(zhí)行,并不是真的一條都不執(zhí)行,而是自動(dòng)的恢復(fù)成執(zhí)行之前的樣子了,看起來(lái)就好像一個(gè)都沒(méi)有執(zhí)行一樣,這個(gè)操作就稱(chēng)為“回滾(rollback)”。
回滾:回滾就是把執(zhí)行過(guò)的操作逆向恢復(fù)回去,就像電腦上的 ctrl + z 操作
數(shù)據(jù)庫(kù)會(huì)把執(zhí)行的每個(gè)操作都記錄下來(lái),如果某個(gè)操作出錯(cuò)了,就會(huì)把事務(wù)中前面的操作進(jìn)行回滾,然后根據(jù)之前進(jìn)行的操作,進(jìn)行逆操作
這些操作是會(huì)有很大開(kāi)銷(xiāo)的,可以保存但不能無(wú)限保存,最多就是把正在執(zhí)行的事務(wù)保存下來(lái),額外的東西不好再保存了
2、事務(wù)的特性
2.1事務(wù)的四大特性
原子性:打包成整體這個(gè)操作,就稱(chēng)為“原子性”,這個(gè)是事務(wù)最核心的特性
舉例說(shuō)明:滑稽老鐵給小美轉(zhuǎn)賬 520 元,此時(shí)滑稽老鐵余額 - 520 元,小美余額 +520,此時(shí)把轉(zhuǎn)賬、滑稽老鐵余額 - 520 元,小美余額 +520元 打包成一個(gè)整體,要么都執(zhí)行,要么一個(gè)都不執(zhí)行,這就具有了原子性。
一致性:事務(wù)執(zhí)行前/執(zhí)行后,都得是數(shù)據(jù)合法的狀態(tài)
舉例說(shuō)明:滑稽老鐵給小美轉(zhuǎn)賬520元,如果轉(zhuǎn)賬成功滑稽老鐵余額-520元,小美余額+520元。如果轉(zhuǎn)賬失敗滑稽老鐵余額不扣錢(qián),小美余額也不加錢(qián)。
注:一致性是根據(jù)原子性而來(lái)的,要么全部執(zhí)行,要么都不執(zhí)行
持久性:事務(wù)產(chǎn)生的修改,都會(huì)寫(xiě)入硬盤(pán)
舉例說(shuō)明:滑稽老鐵給小美轉(zhuǎn)賬 520 元,轉(zhuǎn)賬成功滑稽老鐵余額-520元,小美余額+520元,這個(gè)是持久的,不會(huì)改變的。
隔離性:一個(gè)數(shù)據(jù)庫(kù)服務(wù)器,同時(shí)執(zhí)行多個(gè)事務(wù)的時(shí)候,事務(wù)之間的“相互影響程度”
舉例說(shuō)明:當(dāng)多個(gè)事務(wù)同時(shí)執(zhí)行的時(shí)候,一個(gè)事務(wù)的執(zhí)行是否會(huì)干擾到其他事務(wù),這就是事務(wù)的隔離性
2.2 隔離性的重點(diǎn)說(shuō)明
MySQL 服務(wù)器,是要同時(shí)給多個(gè)客戶(hù)端提供服務(wù),此時(shí)多個(gè)客戶(hù)端之間就可能會(huì)同時(shí)發(fā)生事務(wù),尤其是這多個(gè)事務(wù)在操作同一個(gè)數(shù)據(jù)庫(kù)的同一個(gè)表的時(shí)候,就可能引起一些麻煩
如果隔離性越高,也就意味著事務(wù)之間的并發(fā)程度越低,執(zhí)行效率越慢,但數(shù)據(jù)的準(zhǔn)確性越高
如果隔離性越低,也就意味著事務(wù)之間的并發(fā)程度越高,執(zhí)行效率越快,但數(shù)據(jù)的準(zhǔn)確性越低
2.3 事務(wù)同時(shí)執(zhí)行會(huì)出現(xiàn)的問(wèn)題
2.3.1 臟讀
臟讀:當(dāng)事務(wù)A在寫(xiě)數(shù)據(jù)的時(shí)候,事務(wù)B讀取事務(wù)A寫(xiě)的數(shù)據(jù),事務(wù)B 讀完后,事務(wù)A改了數(shù)據(jù),那么此刻事務(wù)B讀到的數(shù)據(jù)就是錯(cuò)誤的數(shù)據(jù),這就稱(chēng)為“臟讀”問(wèn)題。
舉例說(shuō)明:張三和李四是同桌,有一次老師布置課堂作業(yè)的時(shí)候,李四第二題不會(huì)寫(xiě),于是李四就偷偷的看了一眼張三寫(xiě)的,看到張三第二題選了A,
在這個(gè)場(chǎng)景下,滑稽老鐵和小美這兩個(gè)事務(wù)是完全并發(fā)的沒(méi)有任何限制,在這個(gè)前提下就會(huì)出現(xiàn)臟讀問(wèn)題
問(wèn)題:如何解決臟讀問(wèn)題?
答:解決臟讀問(wèn)題就是降低并發(fā)性、提高隔離性,可以給這里的 "寫(xiě)操作" 進(jìn)行加鎖
加鎖:當(dāng)進(jìn)行了寫(xiě)加鎖,滑稽老鐵在制定表白計(jì)劃表的期間,別人就不能同時(shí)去讀了。相當(dāng)于降低了并發(fā)程度,提高了隔離性,降低了一定的效率,但是提高了準(zhǔn)備性
2.3.1 臟讀
臟讀:當(dāng)事務(wù)A在寫(xiě)數(shù)據(jù)的時(shí)候,事務(wù)B讀取事務(wù)A寫(xiě)的數(shù)據(jù),事務(wù)B 讀完后,事務(wù)A改了數(shù)據(jù),那么此刻事務(wù)B讀到的數(shù)據(jù)就是錯(cuò)誤的數(shù)據(jù),這就稱(chēng)為“臟讀”問(wèn)題。
舉例說(shuō)明:張三在寫(xiě)作業(yè),作業(yè)內(nèi)容 123+32 = 15.. 當(dāng)張三寫(xiě)完 15 之后,李四跑過(guò)來(lái)瞄了一眼張三的答案:123+32=15,于是李四就把這個(gè)答案抄到自己的作業(yè)本上了,但是實(shí)際上張三要寫(xiě)的是 123+32 = 155,但是李四讀到了一個(gè)張三還沒(méi)寫(xiě)完的答案,也就導(dǎo)致李四讀到了一個(gè)錯(cuò)誤的數(shù)據(jù),這就是臟讀問(wèn)題
如何解決臟讀問(wèn)題呢?
答:降低并發(fā)性、提高隔離性,也就是給“寫(xiě)操作”加鎖
加鎖可以分為:寫(xiě)加鎖和讀加鎖
寫(xiě)加鎖:寫(xiě)的時(shí)候,別人不能進(jìn)行讀
讀加鎖:讀的時(shí)候,別人不能進(jìn)行寫(xiě)
2.3.2 不可重復(fù)讀
不可重復(fù)讀:事務(wù)B 在讀的時(shí)候,事務(wù)A改了數(shù)據(jù),此刻事務(wù)B連續(xù)兩次讀到的數(shù)據(jù)結(jié)果不一樣
舉例說(shuō)明:張三在寫(xiě)作業(yè)的時(shí)候,發(fā)生李四一直在瞄。張三感覺(jué)李四有點(diǎn)影響到他了,于是就跟李四約定,等張三寫(xiě)完了再給李四瞄。過(guò)了一會(huì)張三寫(xiě)完了,李四就開(kāi)始瞄了,當(dāng)李四正在瞄的時(shí)候,張三發(fā)現(xiàn)自己有個(gè)地方錯(cuò)了,就李四等一會(huì)再瞄,自己先改一下,這就導(dǎo)致李四之前瞄到的數(shù)據(jù)和現(xiàn)在瞄到的數(shù)據(jù)可能不一樣
如何解決不可重復(fù)讀呢?
答:給讀加鎖,讓李四讀的時(shí)候,張三不能修改。
這兩個(gè)事務(wù)之間的并發(fā)程度進(jìn)一步降低了,隔離性又進(jìn)一步提高了,運(yùn)算速度又進(jìn)一步變慢了,數(shù)據(jù)的準(zhǔn)確性又進(jìn)一步提高了
2.3.3 幻讀
幻讀:事務(wù)A寫(xiě)的時(shí)候,事務(wù)B不能讀;事務(wù)B讀的時(shí)候,事務(wù)A不能寫(xiě)。雖然事務(wù)A不能寫(xiě),但是事務(wù)A可以新增和刪除一個(gè)其他的文件,此刻事務(wù)B 兩次讀到的結(jié)果集就不同了
李四正在瞄的時(shí)候,張三讓他等一下在喵,自己先改一下。李四感覺(jué)自己正在瞄的時(shí)候,張三總是打斷自己,于是就跟張三商量說(shuō),你寫(xiě)的時(shí)候我不去瞄,我瞄的時(shí)候你也不能讓我等一下你去改。于是張三就跟李四約定好了,張三寫(xiě)的時(shí)候李四不能讀,李四讀的時(shí)候張三不能寫(xiě)。李四在瞄的時(shí)候,張三沒(méi)事干,張三就看哪里寫(xiě)錯(cuò)了,發(fā)現(xiàn)寫(xiě)錯(cuò)了自己又不能在李四讀的時(shí)候去改,然后就把正確答案寫(xiě)到另一種本子上,寫(xiě)完后把正確答案在拿出來(lái),李四一看怎么又多了本子,這就是幻讀問(wèn)題
如何解決幻讀問(wèn)題?
答:串行化,徹底的舍棄并發(fā)。就是當(dāng)事務(wù)B讀的時(shí)候,事務(wù)A什么都不能干
3、MySQL提供的隔離級(jí)別
MySQL 為了解決并發(fā)執(zhí)行帶來(lái)的問(wèn)題,提供了四個(gè)隔離級(jí)別
read uncommitted:不做任何限制,事務(wù)之間都是隨意并發(fā)執(zhí)行的。并發(fā)程度最高,隔離性最低。會(huì)產(chǎn)生: 臟讀+不可重復(fù)讀+幻讀
read committed:對(duì)寫(xiě)操作加鎖,并發(fā)程度降低了,隔離性提高了。解決了臟讀問(wèn)題,但仍然存在:不可重復(fù)讀+幻讀
repeatable read:對(duì)寫(xiě)和讀都加鎖了,并發(fā)程度又降低了,隔離性又提高了。解決了臟讀和不可重復(fù)讀問(wèn)題,但可能存在:幻讀文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-480731.html
serializable:嚴(yán)格串行化,并發(fā)程度最低,隔離性最高。解決了臟讀+不可重復(fù)讀+幻讀問(wèn)題,但執(zhí)行速度最慢文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-480731.html
到了這里,關(guān)于【MySQL事務(wù)】保證數(shù)據(jù)完整性的利器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!