© 13_Phunkod/Shutterstock.com
使用數據庫管理系統 (DBMS) 時,交易會定期進行。這些通常作為 ACID 事務執行,這對於保持數據庫健康和正常運行有很多好處。如果您想掌握 DBMS 中的 ACID 屬性,我們已經涵蓋了您需要了解的所有內容。
什麼是 ACID 事務?
關於數據庫,事務是執行單個任務的操作,可能會更改數據庫的內容。事務使用讀寫操作來處理數據。也就是說,它們讀取現有數據並輸入或“寫入”新數據值。一個典型的例子是從您的銀行賬戶轉賬。因此,ACID 事務要么處於完成狀態,要么處於未完成狀態。在此示例中,資金不能同時從您的帳戶中提取和未提取-它要么已經發生,要么沒有。
ACID 事務的目標是在事務執行後保持數據庫的一致性和正確性。 DBMS 中的 ACID 屬性使開發人員能夠執行複雜的操作,同時確保他們的數據安全和正確。實現這一點的方法是通過事務的指定屬性,這些屬性稱為 ACID 屬性。 ACID 代表原子性、一致性、隔離性和持久性。接下來,我們將深入了解這些術語的含義。
ACID事務確保事務執行後數據庫的準確性和一致性。
©dizain/Shutterstock.com
原子性
這是指處理事務中語句的方式。語句是單個任務,例如讀取、寫入、更新或刪除數據。原子性意味著每個語句都被視為一個單元,並且整個任務都被執行,或者一個都不執行。這也阻止了部分交易的發生。
換句話說,如果您的操作一路失敗,原子性有助於防止損壞和數據丟失。數據庫會記錄它所做的每一次更改,如果連接中斷,則這些更改將被撤消。這依賴於稱為“中止”和“提交”的兩個操作。前者在事務中止時撤消更改,後者在事務完成時使更改可見。
一致性
一致性與大多數實際情況下的含義相似.對於數據庫,這意味著事務僅以可預測和預定義的方式更改數據,並且保留數據值。如果事務違反了數據庫規則,那麼它就被放棄。這也可以防止數據損壞或類似原子性的錯誤,並通過避免意外後果來保持數據庫的完整性。
隔離
在使用數據庫時,用戶的交易不會發生,這一點很重要互相干擾。為了實現這一點,隔離被用作一個屬性。這意味著,當用戶同時在同一個數據庫上操作時,每個事務請求都被執行,就好像它們是單獨的請求一樣。這些事務不會相互影響,並且被視為已序列化,即使它們是同時發生的。因為它們是順序的,所以可以防止它們相互影響和破壞數據完整性。
耐久性
最後一個 ACID 屬性是耐久性。這有助於在系統發生故障時通過保存沿途所做的增量更改來保留數據。如果事務成功,則不會撤消更改。持久性還使數據庫能夠在事務中斷的情況下回滾其更改。
DBMS 中的 ACID 屬性:示例事務
現在我們已經介紹了 ACID 的基礎知識屬性,是時候用一個簡單的示例交易來說明這些屬性了。
原子性
解釋原子性的最簡單方法是考慮您要將錢從一個銀行賬戶轉賬到另一個銀行賬戶的情況。
事務必須是原子的,因為您不想遇到未完成的操作繼續進行的情況。在這種情況下,這可能是資金被提取但未存入,或者是第二個賬戶被記入貸方而沒有從源賬戶中提取資金。因此,如果這些交易未成功完成,則需要撤消這些交易,因此原子性至關重要。此示例的數據和事務如下所示。
如果我們想從賬戶 X 向賬戶 Y 轉賬 50 美元,那麼我們需要使用包含兩個步驟的交易 T – T1 和T2。即從 X 賬戶取錢,將錢存入 Y 賬戶。如果交易在 write(X) 執行之後和 write(Y) 執行之前中斷,則操作不一致,數據庫受到損害。因此,交易必須完整進行。如果不是,則交易失敗並撤消操作。
一致性
使用相同的示例,一致性可確保任一賬戶中的資金金額值一致。也就是說,每筆交易開始和結束時的價值是相同的。這保持了數據庫的完整性,以及其中值的可預測性。在這種情況下,遵守銀行餘額應為正整數的約束很重要。否則,交易將失敗。
舉例說明,如果賬戶 X 中的總資金為 500 美元,而我們要將 50 美元轉入賬戶 Y,則兩個賬戶中的總資金必須始終為 500 美元,假設帳戶 Y 中的初始資金為零。一致性可能看起來像是 DBMS 中最簡單的 ACID 屬性之一,但它仍然非常重要。
隔離
顯示一個示例,其中隔離是’使用得當,考慮兩個事務,T 和 T”。當 T 正在檢索數據並從一行更新時,T” 正在計算該數據。如果 T” 在 T 完成更新之前檢索數據,則完成的事務將顯示不正確的數據。此示例的數據和事務如下所示,其中“Weight”=X 和“Height”=Y。
在這種情況下,T 正在將重量值和高度值分別轉換為千克和米,並且 T” 正在嘗試計算根據等式 BMI=kg/m2 得出的人的 BMI。為了說明,我們將考慮這樣的場景,其中 T 一直執行到 Read(Y) 步驟,並且 T” 開始。 X 的正確值由 T” 檢索,因為 X 已經被計算,但是 Y 的錯誤值被檢索,因為更新的值還沒有被 T 寫入。這可以表示為:
T”: (X/Y2=81.36/722=0.016)
實際上,計算應該是:
(X/Y2=81.36/1.832=24.3)
因為 T” 取了 Y 的初始值,現在數據庫不一致,輸出的值不准確,基本上沒有意義。這種檢索到錯誤數據的情況稱為“臟讀”。匯款情況下的差異可能更加隱蔽且更難發現,因為它可能是計算資金和預期資金的相對較小的差異。無論哪種方式,交易都必須隔離,增量變化對任何交易都是不可見的,直到它們有
耐久性
由於耐久性以保存數據為中心,因此可以在斷電的情況下考慮這一點。如果在斷電後出現諸如此類的意外故障錢已經轉移,這個信息的變化應該由數據庫保存在 non-vola 中瓷磚內存。但是,如果在事務期間發生中斷,則更改將根據原子性回滾和撤消。
持久性側重於在發生意外故障時保留數據。
©thinkhubstudio/Shutterstock.com
總結
總而言之,我們可以看出 DBMS 中所有四個 ACID 屬性的重要性。它們共同確保只完成正確的交易,並將更新的信息存儲在非易失性存儲器中以防止意外故障。它們還保持數據更改的可預測性,並確保事務不會相互干擾。
下一步…
解釋 DBMS 中的 ACID 屬性,並提供示例常見問題解答(常見問題解答問題)
DBMS 中的事務是什麼?
事務是指執行一組邏輯工作的一組操作。從這個意義上說,邏輯工作意味著對數據進行有意義的更改,例如將錢從一個帳戶轉移到另一個帳戶。事務可能正在執行、無法完成或由於各種原因而中止。
什麼是 DBMS 中的 ACID 屬性?
ACID 屬性指的是數據庫如何管理使用其數據執行的事務。 ACID 代表原子性、一致性、隔離性和持久性。
為什麼 ACID 屬性很重要?
ACID 屬性有助於保持數據庫中的數據正確和一致,並在發生電源等意外事件時保存數據失敗。除此之外,這些屬性確保事務不會相互干擾。
我什麼時候應該使用多文檔 ACID 事務?
有時,相關數據在多個記錄之間拆分,因此數據操作必須能夠處理此事務才能成功。大多數應用程序不需要多文檔事務,但對於某些應用程序來說,它們是至關重要的。許多數據模型都很靈活,這意味著它們允許將相關數據存儲在單個文檔中,但也能夠處理多文檔數據。 MongoDB 就是一個例子。
使用 ACID 事務的缺點是什麼?
使用 ACID 事務的缺點是數據庫會阻止並發操作,例如作為寫入數據,不受干擾。雖然這在很大程度上是一個好處,但它確實會阻止用戶或客戶在等待另一個交易完成時執行交易。這會對用戶體驗產生負面影響並導致更高的應用程序延遲。
ACID 模型與 BASE 模型相比如何?
ACID 模型旨在提供一致性,而 BASE 模型旨在提供高可用性。 BASE 通過跨數據庫節點傳播和復制數據來實現這一點,允許數據隨時間變化並根據需要執行數據讀取。一致性最終可能會通過 BASE 模型實現,但這不是立即要求。
什麼是關係數據庫?
關係數據庫是一種數據存儲在一個或多個表中,並通過公共鍵相互關聯。因此,數據類型可以通過一對一、一對多或多對多關係相互關聯。
哪些數據庫支持 ACID 屬性?
符合 ACID 標準的 DBMS 包括 MySQL、PostgreSQL、SQLite、Oracle 和 Microsoft SQL Server。
哪個行業主要使用 ACID 屬性?
金融業幾乎完全使用符合 ACID 的 DBMS。
哪些數據庫不支持 ACID 屬性?
NoSQL,或“非-SQL”數據庫不完全支持 ACID 屬性,因為它們沒有固定的表結構。根據 BASE 模型,它們確實提供了最終一致性。