在發布System.Transaction命名空間之前,可以直接用ADO.NET創建事務,也可以通過組件、特性和COM+運行庫(位于System.EnterPRiseServices命名空間中)進行事務處理。本文如題所示,介紹在這些傳統事務處理方式中較為簡單的“asp.net事務”。
在傳統的ADO.NET事務中,如果沒有手動創建事務,每條SQL語句就都是一個事務。如果多條SQL語句應參與到同一個事務處理中,就必須手動創建一個事務。
下面通過一個示例演示:
在MySQL中建立如下表:
插入數據如下:
ADO.NET事務測試代碼:
using(MySqlConnection conn = new MySqlConnection(GetConnection()))
{
conn.Open();
//啟動一個事務
using(MySqlTransaction transaction = conn.BeginTransaction())
{
using (MySqlCommand cmd = conn.CreateCommand())
{
try
{
cmd.Transaction = transaction; //為命令指定事務
cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0009','Name0002');";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0008','Name0003');";
cmd.ExecuteNonQuery();
transaction.Commit(); //事務提交
Response.Write("<scr}catch(Exception ex){transaction.Rollback(); //事務回滾Response.Write(ex.Message);Response.Write("<script>alert('寫入記錄失敗');</script>");}}}}代碼分析:
如示例代碼手動創建ADO.NET事務步驟如下:
1)使用MySqlConnection類的BeginTransaction()方法返回一個MySqlTransaction類型的對象;
2)使用MySqlCommand類對象的Transaction屬性將要參與事務處理的每條命令關聯到上一不返回的MySqlTransaction類型的對象上;
3)如果事務可以成功完成,使用MySqlTransaction對象的Commit()方法提交事務處理結果;
4)如果事務處理中發生錯誤,就調用MySqlTransaction對象的Rollback()方法,撤銷每一個修改。
ADO.NET事務的缺點;
ADO.NET事務只能處理關聯到一個連接上的本地事務,不支持跨多個連接的事務。(為了克服這一缺點,下一節將介紹基于System.Transaction命名空間的分布式事務)。
新聞熱點
疑難解答