什麼是數據庫事務
數據庫事務是指做爲單個邏輯工做單元執行的一系列操做。
設想網上購物的一次交易,其付款過程至少包括如下幾步數據庫操做:
· 更新客戶所購商品的庫存信息
· 保存客戶付款信息--可能包括與銀行系統的交互
· 生成訂單而且保存到數據庫中
· 更新用戶相關信息,例如購物數量等等
正常的狀況下,這些操做將順利進行,最終交易成功,與交易相關的全部數據庫信息也成功地更新。可是,若是在這一系列過程當中任何一個環節出了 差錯,例如在更新商品庫存信息時發生異常、該顧客銀行賬戶存款不足等,都將致使交易失敗。一旦交易失敗,數據庫中全部信息都必須保持交易前的狀態不變,比 如最後一步更新用戶信息時失敗而致使交易失敗,那麼必須保證這筆失敗的交易不影響數據庫的狀態--庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。 不然,數據庫的信息將會一片混亂而不可預測。
數據庫事務正是用來保證這種狀況下交易的平穩性和可預測性的技術。
數據庫事務的ACID屬性
事務處理能夠確保除非事務性單元內的全部操做都成功完成,不然不會永久更新面向數據的資源。經過將一組相關操做組合爲一個要麼所有成功要麼 所有失敗的單元,能夠簡化錯誤恢復並使應用程序更加可靠。一個邏輯工做單元要成爲事務,必須知足所謂的ACID(原子性、一致性、隔離性和持久性)屬性:
· 原子性
事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行。一般,與某個事務關聯的操做具備共同的目標,而且是相互依賴的。若是系統只執行這些操做的一個子集,則可能會破壞事務的整體目標。原子性消除了系統處理操做子集的可能性。
· 一致性
事務在完成時,必須使全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時, 全部的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制全部已知的完整性約束。例如,當開發用於轉 賬的應用程序時,應避免在轉賬過程當中任意移動小數點。
· 隔離性
由併發事務所做的修改必須與任何其它併發事務所做的修改隔離。事務查看數據時數據所處的狀態,要麼是另外一併發事務修改它以前的狀態,要麼是 另外一事務修改它以後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,由於它可以從新裝載起始數據,而且重播一系列事務,以使數據結束時的狀態與原始 事務執行的狀態相同。當事務可序列化時將得到最高的隔離級別。在此級別上,從一組可並行執行的事務得到的結果與經過連續運行每一個事務所得到的結果相同。由 於高度隔離會限制可並行執行的事務數,因此一些應用程序下降隔離級別以換取更大的吞吐量。
· 持久性
事務完成以後,它對於系統的影響是永久性的。該修改即便出現致命的系統故障也將一直保持。
DBMS的責任和咱們的任務
企業級的數據庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就經常使用的SQL Server2000系統而言,它具有鎖定設備隔離事務、記錄設備保證事務持久性等機制。所以,咱們沒必要關心數據庫事務的物理完整性,而應該關注在什麼情 況下使用數據庫事務、事務對性能的影響,如何使用事務等等。