資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完整地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和永續性)屬性。
1、操作流程
設想網上購物的一次交易,其付款過程至少包括以下幾步資料庫操作:
一、更新客戶所購商品的庫存資訊
二、儲存客戶付款資訊--可能包括與銀行系統的互動
三、生成訂單並且儲存到資料庫中
四、更新使用者相關資訊,例如購物數量等等
正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有資料庫資訊也成功地更新。但是,如果在這一系列過程中任何一個環節出了差錯,例如在更新商品庫存資訊時發生異常、該顧客銀行帳戶存款不足等,都將導致交易失敗。一旦交易失敗,資料庫中所有資訊都必須保持交易前的狀態不變,比如最後一步更新使用者資訊時失敗而導致交易失敗,那麼必須保證這筆失敗的交易不影響資料庫的狀態--庫存資訊沒有被更新、使用者也沒有付款,訂單也沒有生成。否則,資料庫的資訊將會一片混亂而不可預測。
資料庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
2、相關屬性
原子性
(atomic)(atomicity)
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
一致性
(consistent)(consistency)
事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。某些維護一致性的責任由應用程式開發人員承擔,他們必須確保應用程式已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程式時,應避免在轉帳過程中任意移動小數點。
隔離性
(insulation)(isolation)
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為隔離性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續執行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程式降低隔離級別以換取更大的吞吐量。
永續性
(Duration)(durability)
事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
3、責任
企業級的資料庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就常用的SQLServer2000系統而言,它具備鎖定裝置隔離事務、記錄裝置保證事務永續性等機制。因此,我們不必關心資料庫事務的物理完整性,而應該關注在什麼情況下使用資料庫事務、事務對效能的影響,如何使用事務等等。
作為大型的企業級資料庫,SQL Server2000對事務提供了很好的支援。我們可以使用SQL語句來定義、提交以及回滾一個事務。
4、處理模型
事務有三種模型:
1.隱式事務是指每一條資料操作語句都自動地成為一個事務,每個事務都有顯式的開始和結束標記。
2.顯式事務是指有顯式的開始和結束標記的事務,事務的開始是隱式的,事務的結束有明確的標記。
3.自動事務是系統自動預設的,開始和結束不用標記。
併發控制
1. 資料庫系統一個明顯的特點是多個使用者共享資料庫資源,尤其是多個使用者可以同時存取相同資料。
序列控制:如果事務是順序執行的,即一個事務完成之後,再開始另一個事務
並行控制:如果DBMS可以同時接受多個事務,並且這些事務在時間上可以重疊執行。
2.併發控制概述
事務是併發控制的基本單位,保證事務ACID的特性是事務處理的重要任務,而併發操作有可能會破壞其ACID特性。
DBMS併發控制機制的責任:
對併發操作進行正確排程,保證事務的隔離性更一般,確保資料庫的一致性。
如果沒有鎖定且多個使用者同時訪問一個資料庫,則當他們的事務同時使用相同的資料時可能會發生問題。由於併發操作帶來的資料不一致性包括:丟失資料修改、讀”髒”資料(髒讀)、不可重複讀、產生幽靈資料。
(1)丟失資料修改
當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。如上例。
再例如,兩個編輯人員製作了同一文件的電子複本。每個編輯人員獨立地更改其複本,然後儲存更改後的複本,這樣就覆蓋了原始文件。最後儲存其更改複本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之後第二個編輯人員才能進行更改,則可以避免該問題。
(2)讀“髒”資料(髒讀)
讀“髒”資料是指事務T1修改某一資料,並將其寫回磁碟,事務T2讀取同一資料後,T1由於某種原因被除撤消,而此時T1把已修改過的資料又恢復原值,T2讀到的資料與資料庫的資料不一致,則T2讀到的資料就為“髒”資料,即不正確的資料。
例如:一個編輯人員正在更改電子文件。在更改過程中,另一個編輯人員複製了該文件(該複本包含到目前為止所做的全部更改)並將其分發給預期的使用者。此後,第一個編輯人員認為所做的更改是錯誤的,於是刪除了所做的編輯並儲存了文件。分發給使用者的文件包含不再存在的編輯內容,並且這些編輯內容應認為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文件,則可以避免該問題。
( 3)不可重複讀
指事務T1讀取資料後,事務T2執行更新操作,使T1無法讀取前一次結果。不可重複讀包括三種情況:
事務T1讀取某一資料後,T2對其做了修改,當T1再次讀該資料後,得到與前一不同的值。
(4)產生幽靈資料
按一定條件從資料庫中讀取了某些記錄後,T2刪除了其中部分記錄,當T1再次按相同條件讀取資料時,發現某些記錄消失
T1按一定條件從資料庫中讀取某些資料記錄後,T2插入了一些記錄,當T1再次按相同條件讀取資料時,發現多了一些記錄。
1、操作流程
設想網上購物的一次交易,其付款過程至少包括以下幾步資料庫操作:
一、更新客戶所購商品的庫存資訊
二、儲存客戶付款資訊--可能包括與銀行系統的互動
三、生成訂單並且儲存到資料庫中
四、更新使用者相關資訊,例如購物數量等等
正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有資料庫資訊也成功地更新。但是,如果在這一系列過程中任何一個環節出了差錯,例如在更新商品庫存資訊時發生異常、該顧客銀行帳戶存款不足等,都將導致交易失敗。一旦交易失敗,資料庫中所有資訊都必須保持交易前的狀態不變,比如最後一步更新使用者資訊時失敗而導致交易失敗,那麼必須保證這筆失敗的交易不影響資料庫的狀態--庫存資訊沒有被更新、使用者也沒有付款,訂單也沒有生成。否則,資料庫的資訊將會一片混亂而不可預測。
資料庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
2、相關屬性
原子性
(atomic)(atomicity)
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
一致性
(consistent)(consistency)
事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。某些維護一致性的責任由應用程式開發人員承擔,他們必須確保應用程式已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程式時,應避免在轉帳過程中任意移動小數點。
隔離性
(insulation)(isolation)
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為隔離性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續執行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程式降低隔離級別以換取更大的吞吐量。
永續性
(Duration)(durability)
事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
3、責任
企業級的資料庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就常用的SQLServer2000系統而言,它具備鎖定裝置隔離事務、記錄裝置保證事務永續性等機制。因此,我們不必關心資料庫事務的物理完整性,而應該關注在什麼情況下使用資料庫事務、事務對效能的影響,如何使用事務等等。
作為大型的企業級資料庫,SQL Server2000對事務提供了很好的支援。我們可以使用SQL語句來定義、提交以及回滾一個事務。
4、處理模型
事務有三種模型:
1.隱式事務是指每一條資料操作語句都自動地成為一個事務,每個事務都有顯式的開始和結束標記。
2.顯式事務是指有顯式的開始和結束標記的事務,事務的開始是隱式的,事務的結束有明確的標記。
3.自動事務是系統自動預設的,開始和結束不用標記。
併發控制
1. 資料庫系統一個明顯的特點是多個使用者共享資料庫資源,尤其是多個使用者可以同時存取相同資料。
序列控制:如果事務是順序執行的,即一個事務完成之後,再開始另一個事務
並行控制:如果DBMS可以同時接受多個事務,並且這些事務在時間上可以重疊執行。
2.併發控制概述
事務是併發控制的基本單位,保證事務ACID的特性是事務處理的重要任務,而併發操作有可能會破壞其ACID特性。
DBMS併發控制機制的責任:
對併發操作進行正確排程,保證事務的隔離性更一般,確保資料庫的一致性。
如果沒有鎖定且多個使用者同時訪問一個資料庫,則當他們的事務同時使用相同的資料時可能會發生問題。由於併發操作帶來的資料不一致性包括:丟失資料修改、讀”髒”資料(髒讀)、不可重複讀、產生幽靈資料。
(1)丟失資料修改
當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。如上例。
再例如,兩個編輯人員製作了同一文件的電子複本。每個編輯人員獨立地更改其複本,然後儲存更改後的複本,這樣就覆蓋了原始文件。最後儲存其更改複本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之後第二個編輯人員才能進行更改,則可以避免該問題。
(2)讀“髒”資料(髒讀)
讀“髒”資料是指事務T1修改某一資料,並將其寫回磁碟,事務T2讀取同一資料後,T1由於某種原因被除撤消,而此時T1把已修改過的資料又恢復原值,T2讀到的資料與資料庫的資料不一致,則T2讀到的資料就為“髒”資料,即不正確的資料。
例如:一個編輯人員正在更改電子文件。在更改過程中,另一個編輯人員複製了該文件(該複本包含到目前為止所做的全部更改)並將其分發給預期的使用者。此後,第一個編輯人員認為所做的更改是錯誤的,於是刪除了所做的編輯並儲存了文件。分發給使用者的文件包含不再存在的編輯內容,並且這些編輯內容應認為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文件,則可以避免該問題。
( 3)不可重複讀
指事務T1讀取資料後,事務T2執行更新操作,使T1無法讀取前一次結果。不可重複讀包括三種情況:
事務T1讀取某一資料後,T2對其做了修改,當T1再次讀該資料後,得到與前一不同的值。
(4)產生幽靈資料
按一定條件從資料庫中讀取了某些記錄後,T2刪除了其中部分記錄,當T1再次按相同條件讀取資料時,發現某些記錄消失
T1按一定條件從資料庫中讀取某些資料記錄後,T2插入了一些記錄,當T1再次按相同條件讀取資料時,發現多了一些記錄。