更新時間:2021-01-04 17:57:26 來源:動力節(jié)點 瀏覽1633次
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在技術(shù)面試和筆試中經(jīng)常會考到數(shù)據(jù)庫事務(wù)相關(guān)的知識。在MySQL中,InnoDB和BDB都支持事務(wù)處理,各自事務(wù)處理的特點不一。本文我們重點來討論MySQL事務(wù)處理的相關(guān)知識。
1、事務(wù)的ACID特性
事務(wù)是由一組SQL語句組成的邏輯處理單元,事務(wù)具有以下4個屬性,通常簡稱為事務(wù)的ACID屬性。
(1)原子性(Atomicity):事務(wù)是一個原子操作單元,其對數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。
(2)一致性(Consistent):在事務(wù)開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持?jǐn)?shù)據(jù)的完整性;事務(wù)結(jié)束時,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)也都必須是正確的。
(3)隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機制,保證事務(wù)在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對外部是不可見的,反之亦然。
(4) 持久性(Durable):事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。
2、事務(wù)處理帶來的相關(guān)問題
由于事務(wù)的并發(fā)執(zhí)行,帶來以下一些著名的問題:
(1)更新丟失(Lost Update):當(dāng)兩個或多個事務(wù)選擇同一行,然后基于最初選定的值更新該行時,由于每個事務(wù)都不知道其他事務(wù)的存在,就會發(fā)生丟失更新問題--最后的更新覆蓋了由其他事務(wù)所做的更新。
(2)臟讀(Dirty Reads):一個事務(wù)正在對一條記錄做修改,在這個事務(wù)完成并提交前,這條記錄的數(shù)據(jù)就處于不一致狀態(tài);這時,另一個事務(wù)也來讀取同一條記錄,如果不加控制,第二個事務(wù)讀取了這些“臟”數(shù)據(jù),并據(jù)此做進一步的處理,就會產(chǎn)生未提交的數(shù)據(jù)依賴關(guān)系。這種現(xiàn)象被形象地叫做"臟讀"。
(3)不可重復(fù)讀(Non-Repeatable Reads):一個事務(wù)在讀取某些數(shù)據(jù)后的某個時間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)其讀出的數(shù)據(jù)已經(jīng)發(fā)生了改變、或某些記錄已經(jīng)被刪除了!這種現(xiàn)象就叫做“不可重復(fù)讀”。
(4)幻讀(Phantom Reads):一個事務(wù)按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為“幻讀”。
3、事務(wù)的隔離性
SQL2標(biāo)準(zhǔn)定義了四個隔離級別。定義語句如下:
SET TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED |
READ COMMITTED |
REPEATABLE READ |
SERIALIZABLE ]
這與Jim Gray所提出的隔離級別有點差異。其中READ UNCOMMITTED即Jim的10(瀏覽);READ COMMITTED即20,游標(biāo)穩(wěn)定性;REPEATABLE READ為2.99990隔離(沒有幻像保護);SERIALIZABLE隔離級別為30,完全隔離。SQL2標(biāo)準(zhǔn)默認(rèn)為完全隔離(30)。各個級別存在問題如下:

各個具體數(shù)據(jù)庫并不一定完全實現(xiàn)了上述4個隔離級別,例如,Oracle只提供READ COMMITTED和Serializable兩個標(biāo)準(zhǔn)隔離級別,另外還提供自己定義的Read only隔離級別;SQL Server除支持上述ISO/ANSI SQL92定義的4個隔離級別外,還支持一個叫做“快照”的隔離級別,但嚴(yán)格來說它是一個用MVCC實現(xiàn)的Serializable隔離級別。MySQL 支持全部4個隔離級別,其默認(rèn)級別為Repeatable read,但在具體實現(xiàn)時,有一些特點,比如在一些隔離級別下是采用MVCC一致性讀。國產(chǎn)數(shù)據(jù)庫DM也支持所有級別,其默認(rèn)級別為READ COMMITTED。
mysql事務(wù)的ACID特性是mysql事務(wù)的基本知識,也就是我們經(jīng)常說的mysql事務(wù)的四大特性。理論知識看起來似乎都很簡單,但真正要去理解透徹還是需要一些指導(dǎo)和案例支持的,在本站的MySQL教程中有著完美的引導(dǎo)學(xué)習(xí)方式,帶我們輕松掌握MySQL事務(wù)的相關(guān)知識。
Java實驗班
0基礎(chǔ) 0學(xué)費 15天面授
Java就業(yè)班
有基礎(chǔ) 直達就業(yè)
Java夜校直播班
業(yè)余時間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)