1. 程式人生 > >Asp.net三種事務處理

Asp.net三種事務處理

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

文章引用自:

相關推薦

Asp.net事務處理

事務處理是在資料處理時經常遇到的問題,經常用到的方法有以下三種總結整理如下:方法1:直接寫入到sql 中 在儲存過程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現 begin trans declare @orderDet

ASP.NET MVC:多語言的技術處理策略

背景 本文介紹了多語言的三種技術處理策略,每種策略對應一種場景,這三種場景是: 多語言資源資訊只被.NET使用。 多語言資源資訊只被Javascript使用。 多語言資源資訊同時被.NET和Javascript使用。 下文我們就一個一個場景的分析。 第一種場景:多語言資源資訊只被.NET使用

.NET、C#和ASP.NET才之間的區別(轉)

編程 tail 基於web 發現 我認 ava 微軟 框架 framwork 經常有同學會在.NET、C#和ASP.NET這三者之間區別不清楚,到底它們之間有什麽聯系呢?在這裏我給大家歸納如下: 1、.NET是一個平臺,一個抽象的平臺的概念。

asp.net開源上傳控件,flash,ajax版,支持多文件

控件 custom add into ive select arch asp.net zed 原文發布時間為:2010-03-18 —— 來源於本人的百度文章 [由搬家工具導入]1、AspnetUpload地址

asp.net mvc中如何處理字符串與對象之間的序列化與反序列化(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

PDO 中支持錯誤處理模式:

測試 語法 nbsp span cat 參數 不執行 處理異常 new PDO 支持三種錯誤處理模式: 靜默模式,警告模式,異常模式 靜默模式是默認的,需要修改的話,通過設置 PDO 對象的屬性完成。 $pdo->setAttribute(PDO::ATTR_ERRM

ASP.NET MVC中錯誤處理方式

itl com archive href tle http ive hive .html http://www.cnblogs.com/shenba/archive/2011/04/16/2018441.htmlASP.NET MVC中錯誤處理方式

DotNET、C#和ASP.NET才之間的區別

關系 .net ren net all pos details div dot Reference 1. DotNET、C#和ASP.NET三才之間的區別 2. ASP.NET、.NET和C#的關系是怎樣的?DotNET、C#和ASP.NET三才之間的區別

IIS與ASP.NET對請求的處理

處理流程 runtime hand 傳遞 階段 mod 管道 isa meta IIS接收請求到進入CLR 當用戶向服務器發送的請求時,以驅動形式運行的HTTP.SYS接收到該請求,將其分發給W3SVC:IIS6中,W3SVC會去解析出UR,並根據從Metaba

asp.net的HTTP請求處理過程

是否 數據 idt pda con tab ase head 兩個 1、asp.net的HTTP請求處理過程說明: (1)、客戶端瀏覽器向服務器發出一個http請求,此請求會被inetinfo.exe進程截獲,然後轉交給aspnet_isapi.dll進程,接著它又通過Ht

springmvc的Controller處理方式及錯誤處理器

後端控制器主要控制資料和檢視,告知和返回給dispatcherservlet。 控制器可以有3種方法返回值 為了突出重點,先把控制器類buyProduct裡實現的3種方法發一下 1.ModelAndView /* * 1,用modelandview傳回值和檢視,不太推薦

ASP.NET Core應用錯誤處理

最近在學習蔣金楠的ASP.NET Core 系列 真的是長知識了,博主地址:https://www.cnblogs.com/artech 一、顯示開發者異常頁面 由於ASP.NET Core應用是面向多個客戶端請求,如果一個錯誤,它並不會影響整個應用的終止,出於安全的考慮,客戶端在預設情況下應該得不到報錯

MySQL資料庫基礎知識事務處理

事務指的是一組SQL語句,它們是一個執行單位,且在必要時還可以取消。事務處理是通過使用提交和回滾功能來實現的。 另一個用途確保某個操作所涉及的行不會在你正在使用它們時被其他客戶端修改。事務把多條語句定義為一個執行單位,防止在多客戶端環境裡可能會發生的併發問題。 事務系統通

ASP.NET的MVC請求處理流程

使用者開啟瀏覽器,在位址列輸入某個網址的URL並回車,瀏覽器便開始像該URL指定的伺服器發起HTTP請求 伺服器的網站服務系統(IIS)接收到該請求,先檢查自己是否認識該類請求,如果認識就直接

如何解決 IIS 空白畫面或執行ASP.NET 時出現【處理常式 "PageHandlerFactory

通常在新的環境,發布ASP.NET網頁到 wwwroot 之後 最常見的異常狀況有兩種: IIS 空白畫面 處理常式 "PageHandlerFactory-I

ASP.NET中進行訊息處理(MSMQ)

   MSMQ是微軟訊息佇列的英文縮寫。那麼什麼是訊息佇列?這些介紹網上一大片這裡就不多說了。本文對於大蝦級的人物來說這只是小玩意而已,對於初學者來說這文章還是有一定的幫助,希望路過的大蝦們別笑話我班門弄斧。一、MSMQ介紹和安裝訊息佇列       關於MSMQ詳細的介紹

[Asp.Net]4方法把資料繫結到Dropdownlist

public class ClassMonth{    private string _MonthEN = DateTime.Now.ToString("MMMM",System.Globalization.CultureInfo.CreateSpecificCulture("en"));    privat

ASP.NET配置ORACLE資料庫的連線方式

ASP.NET 兩種配置ORACLE資料庫的連線方式 1.使用"connectionStrings"標籤定義 2.使用"appSettings"標籤定義 1.使用"connectionStrings"標籤定義 在ASP.NET中的 W

VS2010構建ASP.NET層架構例項演示(一)

開發環境:vs2010+SQLSERVER2008 功能:簡單實現顯示一張表的記錄。 具體步驟:       1、開啟sql server2008,在裡面建立資料庫名為halfcool,然後在資料庫建立users表,裡面有三個欄位id(自動增加),username(

VS2010構建ASP.NET層架構例項演示(

8、業務層(Bll),針對具體問題的操作,也可以說是對資料層的操作,對資料業務邏輯處理。 建立的方法同上。名稱為Bll;解決方案:新增到解決方案;路徑為e:\test\Solution1;然後將Bll目錄下面的class1.cs改名為UserBll.cs了。這層要引用Da