前言
在現(xiàn)代信息系統(tǒng)中,數(shù)據(jù)是至關(guān)重要的資產(chǎn)之一。作為一名后端開(kāi)發(fā)人員,與數(shù)據(jù)庫(kù)的交道必不可少,為了確保數(shù)據(jù)的完整性、一致性和可靠性,數(shù)據(jù)庫(kù)引入了事務(wù)的概念。本次將帶您深入了解數(shù)據(jù)庫(kù)事務(wù)的重要性、特性以及如何在應(yīng)用程序中正確地使用事務(wù)來(lái)維護(hù)數(shù)據(jù)的穩(wěn)定性。
什么是數(shù)據(jù)庫(kù)事務(wù)?
數(shù)據(jù)庫(kù)事務(wù)是一組數(shù)據(jù)庫(kù)操作的集合,這些操作要么全部成功執(zhí)行,要么全部失敗回滾。事務(wù)是數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中的核心概念,用于確保數(shù)據(jù)在并發(fā)訪問(wèn)和操作時(shí)的一致性和完整性。
ACID 特性
事務(wù)通常遵循 ACID 特性,這是指:
- 原子性(Atomicity):事務(wù)中的操作要么全部成功,要么全部失敗。如果任何操作失敗,整個(gè)事務(wù)都會(huì)回滾,保持?jǐn)?shù)據(jù)的一致性。
假設(shè)您正在購(gòu)物超市,您選擇了一些商品放入購(gòu)物籃。原子性就像是您在結(jié)賬時(shí),要么所有商品都被正確地掃描和計(jì)算,要么沒(méi)有商品被結(jié)賬,就像是所有商品一起被稱為一個(gè)“原子”單位。
- 一致性(Consistency):事務(wù)將數(shù)據(jù)庫(kù)從一個(gè)合法狀態(tài)轉(zhuǎn)換為另一個(gè)合法狀態(tài),不會(huì)違反數(shù)據(jù)完整性約束。
在購(gòu)物過(guò)程中,超市會(huì)檢查您購(gòu)物籃中的商品是否與價(jià)格一致,以確保不會(huì)因?yàn)殄e(cuò)誤標(biāo)價(jià)而導(dǎo)致不一致的情況。一致性就像是超市保持商品和價(jià)格一致,您購(gòu)買的商品總是符合預(yù)期。
- 隔離性(Isolation):并發(fā)執(zhí)行的事務(wù)相互隔離,一個(gè)事務(wù)的操作不會(huì)影響其他事務(wù),直到事務(wù)提交才對(duì)其他事務(wù)可見(jiàn)。
想象您和朋友同時(shí)在超市購(gòu)物,但您的購(gòu)物籃和朋友的購(gòu)物籃是分開(kāi)的,互不干擾。這就是隔離性,不同的購(gòu)物籃(事務(wù))在彼此之間是隔離的,不會(huì)相互干擾
- 持久性(Durability):一旦事務(wù)提交,其對(duì)數(shù)據(jù)庫(kù)的更改將永久保存,即使系統(tǒng)崩潰也不會(huì)丟失。
假設(shè)您購(gòu)買了商品并完成了結(jié)賬,超市會(huì)將您購(gòu)買的記錄存檔,以備將來(lái)查詢。即使您離開(kāi)超市,您的購(gòu)買記錄仍然被保留,就像是您的購(gòu)物信息被“持久”存儲(chǔ)
事務(wù)的基本操作
一個(gè)典型的事務(wù)通常包括以下步驟:
-
開(kāi)始事務(wù)(BEGIN):事務(wù)開(kāi)始前,DBMS 記錄當(dāng)前狀態(tài)以備后用。
-
執(zhí)行操作(Perform Operations):在事務(wù)內(nèi)執(zhí)行數(shù)據(jù)庫(kù)操作,如插入、更新、刪除等。
-
提交事務(wù)(COMMIT):如果事務(wù)內(nèi)的所有操作都成功完成,可以將事務(wù)提交,將更改永久保存到數(shù)據(jù)庫(kù)中。
-
回滾事務(wù)(ROLLBACK):如果在事務(wù)執(zhí)行期間發(fā)生錯(cuò)誤,可以回滾事務(wù),撤消之前的操作,將數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)開(kāi)始前的狀態(tài)。
事務(wù)的隔離級(jí)別
事務(wù)隔離級(jí)別控制了事務(wù)之間的可見(jiàn)性和并發(fā)行為。常見(jiàn)的隔離級(jí)別包括:
-
讀未提交(Read Uncommitted):在這個(gè)隔離級(jí)別下,一個(gè)事務(wù)可以讀取其他事務(wù)尚未提交的數(shù)據(jù)。這可能導(dǎo)致臟讀(讀取了未提交的數(shù)據(jù))、不可重復(fù)讀(同一查詢?cè)谑聞?wù)執(zhí)行期間返回不同結(jié)果)和幻讀(事務(wù)在同一查詢中看到不同的數(shù)據(jù)行)等問(wèn)題。讀未提交的隔離級(jí)別最不嚴(yán)格,可能會(huì)引發(fā)數(shù)據(jù)不一致問(wèn)題
-
讀已提交(Read Committed):在這個(gè)隔離級(jí)別下,一個(gè)事務(wù)只能讀取已經(jīng)提交的數(shù)據(jù),避免了臟讀問(wèn)題。但是,不可重復(fù)讀和幻讀問(wèn)題仍然可能出現(xiàn)。因?yàn)槠渌聞?wù)可能在事務(wù)進(jìn)行期間提交新的數(shù)據(jù),導(dǎo)致不同時(shí)間點(diǎn)的查詢結(jié)果不一致。
-
可重復(fù)讀(Repeatable Read):可重復(fù)讀隔離級(jí)別確保在同一事務(wù)內(nèi),同一個(gè)查詢的結(jié)果保持一致。這意味著一個(gè)事務(wù)中的查詢不會(huì)受到其他事務(wù)的修改影響。這可以防止臟讀和不可重復(fù)讀問(wèn)題,但幻讀問(wèn)題仍然可能出現(xiàn),因?yàn)槠渌聞?wù)可能插入新數(shù)據(jù),導(dǎo)致新數(shù)據(jù)行的出現(xiàn)。
-
串行化(Serializable):串行化是最嚴(yán)格的隔離級(jí)別,它確保每個(gè)事務(wù)都在獨(dú)立的時(shí)間段內(nèi)執(zhí)行,防止了并發(fā)問(wèn)題。事務(wù)按照順序一個(gè)接一個(gè)地執(zhí)行,這可以解決臟讀、不可重復(fù)讀和幻讀問(wèn)題。然而,串行化可能會(huì)對(duì)性能產(chǎn)生較大的影響,因?yàn)槭聞?wù)需要依次執(zhí)行。
上面說(shuō)到事務(wù)的隔離級(jí)別可以解決臟讀、幻讀、不可重復(fù)讀的問(wèn)題。那么什么是臟讀、幻讀、和不可重復(fù)讀呢?
-
臟讀(Dirty Read):
臟讀指的是在一個(gè)事務(wù)中讀取了另一個(gè)事務(wù)未提交的數(shù)據(jù)。假設(shè)事務(wù) A 修改了某一行數(shù)據(jù),但還沒(méi)有提交。同時(shí),事務(wù) B 嘗試讀取了事務(wù) A 修改的數(shù)據(jù)。如果事務(wù) A 最終回滾了,那么事務(wù) B 讀取的數(shù)據(jù)就是不存在的,這就是臟讀。臟讀會(huì)導(dǎo)致不準(zhǔn)確的數(shù)據(jù)展示,因?yàn)樽x取的數(shù)據(jù)可能是臨時(shí)的、未經(jīng)驗(yàn)證的。
想象你正在制作一個(gè)蛋糕,但在制作過(guò)程中,你的朋友看了一眼,然后走了。在他離開(kāi)之前,你還沒(méi)有完成蛋糕,但他已經(jīng)看到了不完整的狀態(tài)。這就好像是一個(gè)“臟讀”:朋友讀取了還沒(méi)有完成的信息,結(jié)果可能是不準(zhǔn)確或臨時(shí)的。
-
不可重復(fù)讀(Non-repeatable Read):
不可重復(fù)讀是指在同一個(gè)事務(wù)內(nèi),多次讀取同一數(shù)據(jù)時(shí),得到不同的結(jié)果。這可能是因?yàn)樵谑聞?wù)執(zhí)行期間,其他事務(wù)修改了數(shù)據(jù)。例如,事務(wù) A 在讀取某一行數(shù)據(jù)后,事務(wù) B 修改了這行數(shù)據(jù),并提交了。現(xiàn)在事務(wù) A 再次讀取相同的數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)不同了,造成了不一致的現(xiàn)象。
假設(shè)你正在讀一本小說(shuō),當(dāng)你讀到一部分內(nèi)容時(shí),有人偷偷地在書的后面添加了一些新章節(jié)。如果你再次閱讀同一部分,你會(huì)發(fā)現(xiàn)內(nèi)容已經(jīng)改變了,因?yàn)橛行碌膬?nèi)容被添加進(jìn)來(lái)。這就像是“不可重復(fù)讀”:同樣的數(shù)據(jù)在短時(shí)間內(nèi)發(fā)生了變化,導(dǎo)致你得到了不同的結(jié)果。
-
幻讀(Phantom Read):
幻讀是指在同一個(gè)事務(wù)內(nèi),多次查詢同一范圍的數(shù)據(jù)時(shí),得到不同的結(jié)果。這與不可重復(fù)讀類似,但幻讀關(guān)注的是數(shù)據(jù)的數(shù)量變化。例如,事務(wù) A 在查詢某個(gè)范圍內(nèi)的所有數(shù)據(jù)時(shí),事務(wù) B 插入了新數(shù)據(jù),并提交了?,F(xiàn)在事務(wù) A 再次查詢同一范圍的數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)行的數(shù)量增加了,這就是幻讀。
想象你正在草地上采摘草莓,你數(shù)了一下有多少個(gè)成熟的草莓。然后你去拿一個(gè)籃子,當(dāng)你回來(lái)時(shí),發(fā)現(xiàn)有一些新的草莓從草叢里冒出來(lái),導(dǎo)致總數(shù)增加了。這就是“幻讀”:同一范圍內(nèi)的數(shù)據(jù)在短時(shí)間內(nèi)發(fā)生了變化,導(dǎo)致數(shù)量發(fā)生了變化。
事務(wù)的傳播行為
事務(wù)的傳播行為是指在多個(gè)事務(wù)邊界交互時(shí),一個(gè)事務(wù)如何與另一個(gè)事務(wù)進(jìn)行交互和傳播。傳播行為定義了事務(wù)的范圍、邊界和嵌套關(guān)系,以確保事務(wù)的一致性和正確性。以下是幾種常見(jiàn)的事務(wù)傳播行為:
-
PROPAGATION_REQUIRED(需要事務(wù)):
這是默認(rèn)的傳播行為。如果當(dāng)前沒(méi)有事務(wù),就創(chuàng)建一個(gè)新事務(wù);如果已經(jīng)存在事務(wù),就加入該事務(wù)。這意味著如果方法被調(diào)用時(shí)沒(méi)有事務(wù),則會(huì)創(chuàng)建一個(gè)新事務(wù)。如果方法已經(jīng)在事務(wù)中,則方法將使用已經(jīng)存在的事務(wù)。這樣做可以保證事務(wù)嵌套。
這就像您和朋友在一起制作一張拼圖。如果朋友已經(jīng)在拼圖上工作(存在事務(wù)),您會(huì)加入他的工作。如果沒(méi)有人在拼圖,您會(huì)創(chuàng)建一個(gè)新的拼圖,然后加入制作過(guò)程。這樣,無(wú)論之前是否有拼圖,您都可以保證最終拼圖是一張完整的。
-
PROPAGATION_REQUIRES_NEW(需要新事務(wù)):
無(wú)論當(dāng)前是否存在事務(wù),都會(huì)創(chuàng)建一個(gè)新的事務(wù)。如果方法已經(jīng)在事務(wù)中,則當(dāng)前事務(wù)會(huì)被掛起,新事務(wù)將創(chuàng)建。這樣做可以在方法執(zhí)行期間獨(dú)立于外部事務(wù)創(chuàng)建一個(gè)新的事務(wù),確保完全隔離。
這就像您與朋友們一起在不同的活動(dòng)中度過(guò)周末。無(wú)論朋友們?cè)谧鍪裁椿顒?dòng)(存在事務(wù)),您都決定自己嘗試一項(xiàng)新活動(dòng),不受其他人的影響。您可以全身心地投入新的活動(dòng),不必?fù)?dān)心與其他活動(dòng)的沖突。
-
PROPAGATION_NESTED(嵌套事務(wù)):
如果當(dāng)前存在事務(wù),則在該事務(wù)內(nèi)嵌套一個(gè)新事務(wù)。如果沒(méi)有事務(wù),則行為類似于 PROPAGATION_REQUIRED。嵌套事務(wù)可以回滾到嵌套點(diǎn),而不會(huì)影響外部事務(wù)。這樣可以實(shí)現(xiàn)更細(xì)粒度的事務(wù)管理。
想象您和家人一起做一個(gè)家庭項(xiàng)目,同時(shí)每個(gè)家庭成員也在做各自的小項(xiàng)目。您的小項(xiàng)目被嵌套在整個(gè)家庭項(xiàng)目中。您的項(xiàng)目可以獨(dú)立完成,但仍然受到家庭項(xiàng)目的影響。如果家庭項(xiàng)目失敗,您的項(xiàng)目也會(huì)受到影響。
-
PROPAGATION_SUPPORTS(支持事務(wù)):
如果當(dāng)前存在事務(wù),則加入該事務(wù);如果沒(méi)有事務(wù),則以非事務(wù)方式執(zhí)行。這意味著方法將根據(jù)調(diào)用方的上下文來(lái)決定是否執(zhí)行在事務(wù)中。
這就像您加入一個(gè)跳繩團(tuán)隊(duì)的訓(xùn)練。如果其他人正在跳繩(存在事務(wù)),您可以選擇加入他們的活動(dòng)。如果沒(méi)有人在跳繩,您可以以非正式的方式自己練習(xí),不需要參與到團(tuán)隊(duì)的事務(wù)中。
-
PROPAGATION_NOT_SUPPORTED(不支持事務(wù)):
以非事務(wù)方式執(zhí)行方法。如果當(dāng)前存在事務(wù),則將其掛起,方法執(zhí)行完畢后恢復(fù)原事務(wù)。這樣可以保證方法的執(zhí)行不受外部事務(wù)的影響。
這就像您在休閑時(shí)間去運(yùn)動(dòng),不受任何工作的干擾。無(wú)論別人是否在工作,您可以專注于自己的活動(dòng),沒(méi)有事務(wù)的干擾。
-
PROPAGATION_MANDATORY(強(qiáng)制性的事務(wù)):
必須在一個(gè)已存在的事務(wù)中執(zhí)行,否則將拋出異常。這樣可以確保方法在事務(wù)上下文中被調(diào)用。
這就像您參加一個(gè)要求穿制服的活動(dòng)。您必須穿制服(存在事務(wù))才能參與,否則將無(wú)法參加。
-
PROPAGATION_NEVER(不允許事務(wù)):
必須在非事務(wù)環(huán)境中執(zhí)行,否則將拋出異常。這樣可以確保方法不會(huì)被錯(cuò)誤地嵌套在事務(wù)中。
這就像您在一個(gè)休息時(shí)間內(nèi),被告知不能工作。無(wú)論其他人是否在工作,您不能參與到事務(wù)中。
如何正確使用事務(wù)?
在應(yīng)用程序中,正確使用事務(wù)至關(guān)重要。以下是一些指導(dǎo)原則:
-
小而短的事務(wù):將事務(wù)保持盡可能小和短,以減少對(duì)數(shù)據(jù)庫(kù)資源的鎖定時(shí)間,提高并發(fā)性能。
-
適當(dāng)?shù)母綦x級(jí)別:選擇適當(dāng)?shù)母綦x級(jí)別,平衡數(shù)據(jù)的一致性和性能需求。
-
異常處理:捕獲和處理事務(wù)中的異常,以便在錯(cuò)誤發(fā)生時(shí)能夠正確地回滾事務(wù)。
-
批量操作:對(duì)大量數(shù)據(jù)進(jìn)行操作時(shí),考慮使用批量操作,減少事務(wù)的數(shù)量,提高性能。
-
事務(wù)嵌套:某些數(shù)據(jù)庫(kù)支持事務(wù)嵌套,但必須小心使用,確保正確的提交和回滾順序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-662128.html
總結(jié)
事務(wù)是數(shù)據(jù)庫(kù)管理中保證數(shù)據(jù)一致性和完整性的重要工具。通過(guò)遵循 ACID 特性、正確使用事務(wù)操作和選擇適當(dāng)?shù)母綦x級(jí)別,我們可以確保應(yīng)用程序的數(shù)據(jù)在并發(fā)環(huán)境下保持穩(wěn)定。深入理解和正確使用數(shù)據(jù)庫(kù)事務(wù),將使您的應(yīng)用更加可靠、穩(wěn)定和高效。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-662128.html
到了這里,關(guān)于深入理解數(shù)據(jù)庫(kù)事務(wù):確保數(shù)據(jù)完整性與一致性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!