三種事務處理
事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下3種總結整理如下:
方法1:直接寫入到sql 中
在存儲過程中使用 begin trans, commit trans, rollback trans 實現 
begin trans
declare @orderdetailserror int,@procunterror int
delete from [order details] where productid=42
select @orderdetailserror [email protected]@error
delete from products where productid=42
select @[email protected]@error
if(@orderdetailserror =0 and @procunterror=0)
commit trans
else
rollback trans
優點:
  所有事務邏輯包含在一個單獨的調用中
  擁有運行一個事務的最佳性能
  獨立于應用程序
限制:
  事務上下文僅存在于數據庫調用中
  數據庫代碼與數據庫系統有關
方法2 :使用ado.net 實現 
使用ado.net 實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在數據層來實現。
sqlconnection 和oledbconnection  對象有一個 begintransaction 方法,它可以返回 sqltransaction 
或者oledbtransaction 對象。而且這個對象有 commit 和 rollback 方法來管理事務 
   sqlconnection sqlconnection = new sqlconnection("workstation id=weixiaoping;packet size=4096;user id=sa;initial catalog=northwind;persist security info=false");
   sqlconnection.open();
   sqltransaction  mytrans = sqlconnection.begintransaction();
   sqlcommand sqlinsertcommand = new sqlcommand();
   sqlinsertcommand.connection = sqlconnection
   sqlinsertcommand.transaction=mytrans;
   try{
       sqlinsertcommand.commandtext="insert into tbtree(context,parentid) values('北京',1)";
       sqlinsertcommand.executenonquery();
       sqlinsertcommand.commandtext="insert into tbtree(context,parentid) values('上海',1)";
       sqlinsertcommand.executenonquery();
       mytrans.commit();
     }catch(exception ex)
     {
      mytrans.rollback();
     }
    finally
    {
     sqlconnection.close();
    }
優點:
     簡單性 
     和數據據事務差不多的快 
     獨立于數據庫,不同數據庫的專有代碼被隱藏了 
缺點:
     事務不能跨越多個數據庫連接 
     事務執行在數據庫連接層上,所以需要在事務過程中維護一個數據庫連接
     ado.net分布事務也可以跨越多個數據庫,但是其中一個sql server 數據庫的話,通過用sql server連接服務器連接到別的數據庫,但是如果是在db2和orcal之間就不可以。
以上兩種事務是經常用到的事務處理方法。
方法3  com+事務(分布式事務)
.net framework 依靠 mts/com+ 服務來支持自動事務。com+ 使用 microsoft distributed transaction coordinator (dtc) 作為事務管理器和事務協調器在分布式環境中運行事務。
這樣可使 .net 應用程序運行跨多個資源結合不同操作(例如,將定單插入 sql server 數據庫、將消息寫入 microsoft 消息隊列 (msmq) 隊列、以及從 oracle 數據庫檢索數據)
的事務。
   com+事務處理的類必須繼承system.enterpriseservices.servicedcomponent,其實web service就是繼承system.enterpriseservices.servicedcomponent,所以web service也支持
com+事務。
   定義一個com+事務處理的類
        [transaction(transactionoption.required)]
 public class dataaccess:system.enterpriseservices.servicedcomponent
 { 
        }
transactionoption枚舉類型支持5個com+值(disabled,notsupported,required,requiresnew,supported)
disabled      忽略當前上下文中的任何事務。 
notsupported  使用非受控事務在上下文中創建組件。 
required      如果事務存在則共享事務,并且如有必要則創建新事務。 
requiresnew   使用新事務創建組件,而與當前上下文的狀態無關。 
supported     如果事務存在,則共享該事務。 
一般來說com+中的組件需要required 或supported。當組件用于記錄或查帳時requiresnew 很有用,因為組件應該與活動中其他事務處理的提交或回滾隔離開來。
派生類可以重載基類的任意屬性。如dataaccess選用required,派生類仍然可以重載并指定requiresnew或其他值。
 
com+事務有手動處理和自動處理,自動處理就是在所需要自動處理的方法前加上[autocomplete],根據方法的正常或拋出異常決定提交或回滾。
手動處理就是調用contextutil類中enablecommit,setcomplete,setabort方法。
            public string  testtransaction()
  {
   try
   {
    contextutil.enablecommit();
    insertarecord1();
    insertarecord2();
                                contextutil.setcomplete();
    return "succeed!";
   }
   catch(exception ex)
   {
    contextutil.setabort();
           return "failed!";
   }     
  }
             public void insertarecord1()
  {
   
    string strconn="workstation id=weixiaoping;packet size=4096;user id=sa;initial catalog=northwind;persist security info=false";
    sqlconnection conn=new sqlconnection(strconn);
    conn.open();
    sqlcommand command=new sqlcommand("insert into tbtree(context,parentid) values('北京',1)",conn);
    command.executenonquery();
    conn.close();         
     
  }
              public void insertarecord2()
  {
   
    string strconn="workstation id=weixiaoping;packet size=4096;user id=sa;initial catalog=northwind;persist security info=false";
    sqlconnection conn=new sqlconnection(strconn);
    conn.open();
    sqlcommand command=new sqlcommand("insert into tbtree(context,parentid) values('上海',1)",conn);
    command.executenonquery();
    conn.close();     
  }
在需要事務跨 msmq 和其他可識別事務的資源(例如,sql server 數據庫)運行的系統中,只能使用 dtc 或 com+ 事務,除此之外沒有其他選擇。dtc 協調參與分布式事務的所有資源管理器,
  也管理與事務相關的操作。 
這種做法的缺點是,由于存在 dtc 和 com 互操作性開銷,導致性能降低。
com+事務處理的類必須強命名。
新聞熱點
疑難解答
圖片精選