ADO.NET提供了處理後台數據所需要的一切功能,並且使用起來就如同從一張表格中讀取一個數據那樣簡單。事務處理(transaction)允許你把數據庫操作歸為一組,由此來保證所有的操作都能夠執行。因為一旦其中的一項操作執行失敗,則整個事務處理都會失敗。現在讓我們來看看在.Net Framework下是如何使用事務處理的。
事務處理概況
事務處理是把一組操作合並為一個邏輯上的工作單元。在系統中沒有出現錯誤的情況下,開發人員可以使用事務處理來控制並保持事務處理中每一個動作的連續性和完整性。
使用這樣的方法可能導致向兩個極端情況發展:要麼在事務處理中的所有操作都得到執行,要麼沒有任何操作得到執行。這樣的方法對於實時應用程序來說非常必要。
銀行業務是一個范例。事務處理應當包括從一個帳戶到另一帳戶的轉帳過程。這一過程屬於事務處理,原因是從某帳戶中支出和在另一帳戶存入兩個動作必須被作為一個整體來執行——任何一方都不允許失敗。在深入研究ADO.Net編程之前,讓我們先來看看在SQL中是如何進行事務處理的。
SQL事務處理
SQL允許開發人員使用兩個簡單的聲明來使用事務處理
Begin Transaction (啟動事務處理)
Commit Transaction (提交事務處理)
在兩條聲明中的所有語句都成為事務處理的一部分。命令Begin Transaction位於整個事務處理的起始位置,因此其後的所有命令只有在執行到命令Commit Transaction時才會被一並執行。ADO.Net方法就這麼簡單。
ADO.Net事務處理
事務處理需要一個數據庫連接以及一個事務處理對象。在SQL Server和ADO.Net中使用事務處理的難點在於SqlTransaction類。此類名稱隨所使用的數據庫平台的不同而會有一些變化。例如,對於OLEDB數據庫來說,事務處理類名為OleDbTransaction。
System.Data.SqlClIEnt namespace包括了SqlTransaction類。此類包括了兩個屬性:
Connection:指示同事務處理相關聯的SqlConnection對象;
IsolationLevel:定義事務處理的IsolationLevel。
屬性IsolationLevel是包括如下成員的枚舉對象:
Chaos:從高度獨立的事務處理中出現的pending changes不能被覆蓋;
ReadCommitted:當數據需要被非惡意讀取時,采用共享鎖定(shared locks),但數據仍然可以在事務處理結束時被更新,這造成了非重復性的數據讀取(nonrepeatable reads)或phantom data的產生;
ReadUncommitted:惡意讀取數據是可能發生的,這表示沒有使用共享鎖定(shared locks),並且沒有實現獨占鎖定(exclusive locks);
RepeatableRead:鎖定查詢中所用到的所有數據,由此避免其他用戶對數據進行更新。在phantom rows仍然可用的狀態下,這可以避免非重復性的數據讀取(nonrepeatable reads);
Serialisable:在DataSet中進行范圍鎖定,由此防止其他用戶在事務處理結束之前更新數據或在數據庫中插入行;
IsolationLevel定義鎖定記錄的級別,但這一概念不在本文論述范圍之內。對象SqlTransaction也提供了類似的方法。你可以使用以下方法來進行事務處理:
Commit:提交數據庫事務處理;
Rollback:從未決狀態(pending state)反轉(roll back)事務處理。事務處理一旦被提交後即不能執行此操作;
Save:在事務處理中創建savepoint可以對事務處理的一部分進行反轉,並且指定savepoint名稱。
以下的C#示例將這些部分綜合起來。
這一簡單的控制台程序將通過以下步驟將兩行插入到Northwind數據庫的表格中:
調用Connection對象的BeginTransaction方法以標記事務處理的起始位置。BeginTransaction方法對事務處理返回了一個坐標(reference),此坐標被指定給事務處理所用到的Command對象。
將Transaction對象指定給將要執行的Command的Transaction屬性。