剖析概括ADO.NET執行事務
事務往往是我們很難處理的一部分,這里結合我的經驗和大家來談談關于ADO.NET執行事務。如果要將多項任務綁定在一起,使其作為單個工作單元來執行,可以使用ADO.NET中的事務。例如,假設應用程序執行兩項任務。首先使用訂單信息更新表。然后更新包含庫存信息的表,將已訂購的商品記入借方。如果任何一項任務失敗,兩個更新均將回滾。
確定事務類型
事務如果是單階段事務,并且由數據庫直接處理,則屬于本地事務。事務如果由事務監視程序進行協調并使用故障保護機制(例如兩階段提交)解決事務,則屬于分布式事務。每個.NETFramework數據提供程序使用自己的Transaction對象來執行本地事務。如果要求在SQLServer數據庫中執行,請選擇System.Data.SqlClient事務。對于Oracle事務,使用System.Data.OracleClient提供程序。此外,還提供了一個新的DbTransaction類,用于編寫需要事務并且與提供程序無關的代碼。
在服務器上執行時,事務最有效。如果使用的SQLServer數據庫廣泛使用顯式事務,應考慮使用Transact-SQLBEGINTRANSACTION語句以存儲過程的形式編寫這些事務。有關執行服務器端事務的更多信息,請參見“SQLServer聯機圖書”。
使用單個連接ADO.NET執行事務
在ADO.NET中,使用Connection對象控制事務。可以使用BeginTransaction方法啟動本地事務。開始事務后,可以使用Command對象的Transaction屬性在該事務中登記一個命令。然后,可以根據事務組件的成功或失敗,提交或回滾在數據源上進行的修改。不應對本地事務使用EnlistDistributedTransaction方法。
#T#事務的作用域限于該連接。以下示例執行顯式事務,該事務由try塊中兩個獨立的命令組成。這兩個命令對AdventureWorksSQLServer2005示例數據庫的Production.ScrapReason表執行INSERT語句,如果沒有引發異常,則提交。如果引發異常,catch塊中的代碼將回滾事務。如果在事務完成之前事務中止或連接關閉,事務將自動回滾。
按照下列步驟ADO.NET執行事務。
1.調用SqlConnection對象的BeginTransaction方法,以標記事務的開始。BeginTransaction方法返回對事務的引用。此引用分配給在事務中登記的SqlCommand對象。
2.將Transaction對象分配給要執行的SqlCommand的Transaction屬性。如果在具有活動事務的連接上執行命令,并且尚未將Transaction對象配給Command對象的Transaction屬性,則會引發異常。
3.執行所需的命令。
4.調用SqlTransaction對象的Commit方法完成事務,或調用Rollback方法結束事務。如果在Commit或Rollback方法執行之前連接關閉或斷開,事務將回滾。
以下代碼示例演示對MicrosoftSQLServer使用ADO.NET的事務邏輯。
- UsingconnectionAsNewSqlConnection(connectionString)
- connection.Open()
- 'Startalocaltransaction.
- DimsqlTranAsSqlTransaction=connection.BeginTransaction()
- 'Enlistacommandinthecurrenttransaction.
- DimcommandAsSqlCommand=connection.CreateCommand()
- command.Transaction=sqlTran
- Try
- 'Executetwoseparatecommands.
- command.CommandText=_
- "INSERTINTOProduction.ScrapReason(Name)VALUES('Wrongsize')"
- command.ExecuteNonQuery()
- command.CommandText=_
- "INSERTINTOProduction.ScrapReason(Name)VALUES('Wrongcolor')"
- command.ExecuteNonQuery()
- 'Committhetransaction
- sqlTran.Commit()
- Console.WriteLine("Bothrecordswerewrittentodatabase.")
- CatchexAsException
- 'Handletheexceptionifthetransactionfailstocommit.
- Console.WriteLine(ex.Message)
- Try
- 'Attempttorollbackthetransaction.
- sqlTran.Rollback()
- CatchexRollbackAsException
- 'ThrowsanInvalidOperationExceptioniftheconnection
- 'isclosedorthetransactionhasalreadybeenrolled
- 'backontheserver.
- Console.WriteLine(exRollback.Message)
- EndTry
- EndTry
- EndUsing