深入解析MySQL?事務(wù)
事務(wù)指邏輯上的一組操作,組成這組操作的各個(gè)單元,要么全部成功,要么全部失敗。
事務(wù)的四大特性 ( ACID )
原子性(Atomicity):一個(gè)事物是一個(gè)不可分割的單位,要么全都執(zhí)行,要么都不執(zhí)行;
一致性(Consistency):事務(wù)執(zhí)行前后,數(shù)據(jù)處于合法的狀態(tài);
持久性(Isolation):事務(wù)執(zhí)行完后,數(shù)據(jù)的修改是持久的,不會(huì)因?yàn)槠渌僮骰蚬收隙鴮?duì)其產(chǎn)生影響;
隔離性(Durability):多個(gè)事務(wù)并發(fā)執(zhí)行的,事務(wù)之間不互相干擾。
假如事物的一個(gè)操作整體(動(dòng)作A,B),動(dòng)作A,執(zhí)行完了,動(dòng)作B,執(zhí)行到一半,執(zhí)行過(guò)程出錯(cuò),這時(shí)怎么辦?有回滾機(jī)制,有個(gè)日志會(huì)記錄這些操作,記錄數(shù)據(jù)修改前和數(shù)據(jù)修改后的值。
臟讀
事務(wù)A正在修改數(shù)據(jù)(但是沒(méi)有提交),事務(wù)B就讀取了這里的數(shù)據(jù),此時(shí)事務(wù)B讀取的操作稱為臟讀。 解決辦法:給寫(xiě)操作加鎖,當(dāng)事務(wù)A在寫(xiě)數(shù)據(jù)的時(shí)候,事務(wù)B無(wú)法讀取。
不可重復(fù)讀
事務(wù)A修改數(shù)據(jù)之后提交了數(shù)據(jù)“name=L”,然后事務(wù)B就讀取數(shù)據(jù),但是此時(shí)A覺(jué)得修改的數(shù)據(jù)不滿意“name=H”,繼續(xù)修改提交了,此時(shí)事務(wù)B再次讀取,發(fā)現(xiàn),啊,怎么數(shù)據(jù)不一樣了。這就是不可重復(fù)讀的問(wèn)題。 解決辦法:給寫(xiě)操作加鎖的同時(shí),給讀操作也加鎖,當(dāng)事務(wù)A在寫(xiě)的時(shí)候,事務(wù)B不可以讀,事物B在讀的時(shí)候,事物A也不可以寫(xiě)。
幻讀
雖然已經(jīng)給寫(xiě)操作加鎖,和讀操作加鎖,但是會(huì)有種情況,事務(wù)B在讀的時(shí)候,事務(wù)A無(wú)法修改name,但是事務(wù)A可以再寫(xiě)一個(gè)age,當(dāng)事務(wù)B再次讀取數(shù)據(jù)的時(shí)候發(fā)現(xiàn),咦,怎么多了條數(shù)據(jù)。 解決辦法:只能嚴(yán)格的串行化執(zhí)行。(并發(fā)程度最低,效率也最低,但是數(shù)據(jù)的可靠性最高)
這里很容易搞混不可重復(fù)讀和幻讀。其實(shí)只需要理解,不可重復(fù)讀是修改數(shù)據(jù),數(shù)據(jù)的條數(shù)不變;幻讀是增加或者刪除數(shù)據(jù),數(shù)據(jù)的內(nèi)容不變,條數(shù)發(fā)生改變。
MySQL的隔離級(jí)別
讀未提交(read-uncommitted):會(huì)有臟讀,不可重復(fù)讀,幻讀問(wèn)題 不可重復(fù)讀(read-committed):會(huì)有不可重復(fù)讀,幻讀問(wèn)題 可重復(fù)讀(repeatable-read):會(huì)有幻讀問(wèn)題 串行化 (serializable):解決這三個(gè)問(wèn)題
事務(wù)的隔離級(jí)別并不是越高越好,但事務(wù)的隔離級(jí)別越高,那么并發(fā)性就越低,效率越低,數(shù)據(jù)的可靠性就會(huì)越高。
MySQL8開(kāi)始,用SELECT@@GLOBAL.transaction_isolation,@@transaction_isolation;
查詢隔離級(jí)別(這里是是MySQL5)
這里我們可以看到MySQL的全局隔離級(jí)別和當(dāng)前會(huì)話隔離級(jí)別皆是REPEATABLE一READ(可重復(fù)讀),不同的數(shù)據(jù)庫(kù)有不同的默認(rèn)隔離級(jí)別,而且我們也可以自行修改它。
通過(guò)如下命令可以修改隔離級(jí)別(建議在修改時(shí)修改當(dāng)前 session 隔離級(jí)別即可,不用修改全局的隔離級(jí)別):
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
注意,如果只是修改了當(dāng)前 session 的隔離級(jí)別,則換一個(gè) session 之后,隔離級(jí)別又會(huì)恢復(fù)到默認(rèn)的隔離級(jí)別,所以我們測(cè)試時(shí),修改當(dāng)前 session 的隔離級(jí)別即可。
到此這篇關(guān)于深入解析MySQL 事務(wù)的文章就介紹到這了,更多相關(guān)MySQL 事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea中使用mysql的保姆級(jí)教程(超詳細(xì))
我們開(kāi)發(fā)時(shí)經(jīng)常需要用到一些客戶端去訪問(wèn)數(shù)據(jù)庫(kù)查詢、更新數(shù)據(jù)等操作,下面這篇文章主要給大家介紹了關(guān)于idea中使用mysql的保姆級(jí)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎和分支現(xiàn)狀分析
在MySQL經(jīng)歷了2008年Sun的收購(gòu)和2009年Oracle收購(gòu)Sun的過(guò)程中,基本處于停滯發(fā)展的情況,在可以預(yù)見(jiàn)的未來(lái),MySQL是肯定會(huì)被Oracle擱置并且逐步雪藏消滅掉的。2011-03-03MYSQL如何自動(dòng)為查詢數(shù)據(jù)的結(jié)果編上序號(hào)詳解
這篇文章主要給大家介紹了關(guān)于MYSQL如何自動(dòng)為查詢數(shù)據(jù)的結(jié)果編上序號(hào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-11-11MySQL與PHP的基礎(chǔ)與應(yīng)用專題之創(chuàng)建數(shù)據(jù)庫(kù)表
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎(chǔ)應(yīng)用,本篇從數(shù)據(jù)庫(kù)的創(chuàng)建開(kāi)始2022-02-02MySQL5.7的sql腳本導(dǎo)入到MySQL5.5出錯(cuò)3種解決方案
筆者需要將使用MySQL5.7數(shù)據(jù)庫(kù)的網(wǎng)站挪入winows服務(wù)器,目標(biāo)服務(wù)器使用的是MySQL5.5,因?yàn)榧骖櫟揭郧暗木W(wǎng)站,MySQL不能升級(jí)。遇到MySQL5.7的sql腳本導(dǎo)入到MySQL5.5出錯(cuò),總結(jié)了3種解決方案,總有一個(gè)方案適合你。2023-06-06查看當(dāng)前mysql使用頻繁的sql語(yǔ)句(詳解)
下面小編就為大家?guī)?lái)一篇查看當(dāng)前mysql使用頻繁的sql語(yǔ)句(詳解)。小編覺(jué)的挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03關(guān)于InnoDB索引的底層實(shí)現(xiàn)和實(shí)際效果
這篇文章主要介紹了關(guān)于InnoDB索引的底層實(shí)現(xiàn)和實(shí)際效果,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12