一、什么是事務(wù)?
事務(wù)是由一組sql語(yǔ)句組成的邏輯處理單元需五。
二、事務(wù)的ACID屬性
原子性(Atomicity)
事務(wù)是一個(gè)原子操作單元诗舰。特點(diǎn)是不可再分警儒,當(dāng)操作中有多個(gè)步驟時(shí),要么全成功眶根,要么全失敗蜀铲。一致性(Consistent)
在事務(wù)開(kāi)始與完成時(shí),數(shù)據(jù)都必須保持一致?tīng)顟B(tài)属百,這意味著所有相關(guān)數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改记劝,以保持?jǐn)?shù)據(jù)的完整性。
例如族扰,A向B轉(zhuǎn)賬厌丑,不可能A扣了錢(qián),B卻沒(méi)收到渔呵。隔離性(Isolation)
數(shù)據(jù)庫(kù)系統(tǒng)提供統(tǒng)一的隔離機(jī)制怒竿,保證每個(gè)事務(wù)都在單獨(dú)的環(huán)境執(zhí)行,事務(wù)之間互不影響扩氢。
這意味著事務(wù)之間處理過(guò)程是對(duì)其他事務(wù)不可見(jiàn)的耕驰。持久性(Durable)
事務(wù)完成后,它對(duì)數(shù)據(jù)的修改時(shí)永久性的录豺,即使出現(xiàn)系統(tǒng)宕機(jī)朦肘,數(shù)據(jù)依然能恢復(fù),存在于數(shù)據(jù)庫(kù)双饥。
三媒抠、事務(wù)并發(fā)帶來(lái)的4類(lèi)問(wèn)題
臟讀(Dirty Reads)
事務(wù)A讀取到了事務(wù)B修改但尚未提交的數(shù)據(jù),然后事務(wù)B回滾了咏花,因此事務(wù)A基于此數(shù)據(jù)做的操作都是無(wú)效的趴生,就是讀到了臟數(shù)據(jù)(實(shí)際上應(yīng)該存在的數(shù)據(jù)),所以叫臟讀。臟寫(xiě)或丟失更新(Lost Update)
第一類(lèi)丟失更新:撤銷(xiāo)(rollback)一個(gè)事務(wù)時(shí)冲秽,把其他事務(wù)已經(jīng)提交更新的數(shù)據(jù)給回滾掉了舍咖。
第二類(lèi)丟失更新:提交(commit)一個(gè)事務(wù)時(shí),把其他事務(wù)已經(jīng)提交更新的數(shù)據(jù)給覆蓋掉了锉桑。不可重復(fù)讀(Non-Repeatable Reads)
在事務(wù)A中排霉,按相同的條件執(zhí)行查詢過(guò)的sql,返回結(jié)果發(fā)生了修改或被刪除了民轴,這種現(xiàn)象叫做“不可重復(fù)讀”攻柠。幻讀(Phantom Reads)
在事務(wù)A中,按相同的條件執(zhí)行查詢過(guò)的sql后裸,返回結(jié)果中有新數(shù)據(jù)(其他事務(wù)插入的數(shù)據(jù))瑰钮,就好像發(fā)生了幻覺(jué)一樣,被稱(chēng)為“幻讀”微驶。
四浪谴、事務(wù)的四種隔離級(jí)別
讀未提交(Read Uncommitted, RU)
當(dāng)前事務(wù)讀取了其他事務(wù)還未提交的數(shù)據(jù)。
由于可能會(huì)造成臟讀因苹,所以實(shí)際中很少使用苟耻。讀已提交(Read Committed, RC)
事務(wù)A修改并提交的數(shù)據(jù)才會(huì)對(duì)其他事務(wù)可見(jiàn),所以可以解決臟讀問(wèn)題扶檐。
多數(shù)RDBMS的默認(rèn)隔離級(jí)別都是讀已提交凶杖,例如Oracle,PostgreSQL款筑,SqlServer智蝠,但Mysql不是。可重復(fù)讀(Repeatable Read, RR)
在同一事務(wù)中多次讀取相同記錄的結(jié)果是一致的奈梳,所以解決了臟讀和不可重復(fù)讀的問(wèn)題杈湾,但未解決幻讀。串行化(Serializable)
串行化是最高的隔離級(jí)別攘须,它通過(guò)強(qiáng)制事務(wù)串行執(zhí)行漆撞,避免了臟讀、不可重復(fù)讀阻课、幻讀問(wèn)題。
簡(jiǎn)單來(lái)說(shuō)艰匙,串行化會(huì)在讀取的每一行數(shù)據(jù)上都加上鎖限煞,所以可能導(dǎo)致大量的超時(shí)和鎖征用問(wèn)題。
實(shí)際應(yīng)用中也很少用到這個(gè)隔離級(jí)別员凝,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒(méi)有并發(fā)的情況才考慮用該級(jí)別署驻。
總結(jié):
數(shù)據(jù)庫(kù)的事務(wù)隔離越嚴(yán)格,并發(fā)副作用越小,但付出的代價(jià)也就越大旺上。
查看當(dāng)前數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別
mysql8中瓶蚂,記錄數(shù)據(jù)庫(kù)隔離級(jí)別的字段名稱(chēng)為 ‘transaction_isolation’,默認(rèn)級(jí)別為‘可重復(fù)讀’宣吱。
mysql5.7中窃这,記錄數(shù)據(jù)庫(kù)隔離級(jí)別的字段名稱(chēng)為 ‘tx_isolation’,查詢語(yǔ)句為select @@tx_isolation;
參考資料
一文搞定Mysql事務(wù)隔離級(jí)別與鎖機(jī)制
事務(wù)隔離機(jī)制 -- 必須說(shuō)透