日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net 事务处理的三种方法

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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 =@@error
delete from products where productid=42
select @procuntError=@@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+事務處理的類必須強命名。

?

轉載于:https://www.cnblogs.com/llbofchina/p/3668266.html

總結

以上是生活随笔為你收集整理的.net 事务处理的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。