国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net三種事務處理

2024-07-10 13:06:17
字體:
來源:轉載
供稿:網友

三種事務處理
事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下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+事務處理的類必須強命名。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安泽县| 水城县| 周至县| 阳高县| 兴国县| 平塘县| 葫芦岛市| 郧西县| 恩施市| 沈丘县| 宁德市| 卓资县| 泾阳县| 武山县| 广河县| 宜阳县| 积石山| 昌平区| 两当县| 大关县| 台东县| 宽城| 金门县| 文昌市| 朔州市| 鸡泽县| 馆陶县| 湾仔区| 娱乐| 三穗县| 南部县| 东乌| 许昌县| 阿鲁科尔沁旗| 波密县| 从化市| 镇雄县| 旬邑县| 化州市| 奉节县| 南木林县|