事務在c#中的使用_第1頁
事務在c#中的使用_第2頁
事務在c#中的使用_第3頁
事務在c#中的使用_第4頁
事務在c#中的使用_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第事務在c#中的使用目錄一、概述1、事務ACID特性2、.NET開發者用到的5種事務機制:二、數據庫事務1、不同數據庫的事務規則2、數據庫事務的優勢和限制(1)優勢:(2)限制:三、ADO.Net事務四、System.EnterpriseServices自動事務處理五、System.Transactions事務1、顯式事務(ExplicitTransaction)2、Transaction類的派生類3、Transaction類成員六、可提交的事務:CommitableTransaction(顯式事務)七、環境事務:TrasactionScope(隱式事務,推薦)1、隔離級別IsolationLevel2、嵌套環境事務3、TransactionScopeOption4、MSDTC組件設置:八、依賴事務DependentTransaction,跨多個線程調用事務(顯式事務)

一、概述

1、事務ACID特性

事務將一系列的工作視為一個工作單元,它具有ACID特性:

A:Atomicity不可分性

也就是說事務中有多項工作,如果有一項工作失敗了,整個事務就算失敗了。C:Consistency一致性

事務完成時,全部數據必須維持一致性的狀態。對于關系數據庫,簡單地來說就是沒有破壞數據完整性。I:Isolation隔離性

事務與其他事務是隔離的,也就是說一個事務的一項工作對數據進行修改時,如果整個事務還沒有結束,其他事務就無法知道這個數據發生了修改。D:Durability持久性

事務完成后,其作用便永遠存在于系統之中。

2、.NET開發者用到的5種事務機制:

SQL和存儲過程級別的事務。(數據庫事務)ADO.NET級別的事務。ASP.NET頁面級別的事務。企業級服務COM+事務。System.Transactions事務處理。

這5種事務機制有著各自的優勢和劣勢,分別表現在性能、代碼數量和部署設置等方面。開發人員可以根據項目的實際情況選擇相應的事務機制。

二、數據庫事務

1、不同數據庫的事務規則

數據庫事務是其他事務模型的基礎,當一個事務創建時不同數據庫系統都有自己的規則。

SQLServer默認在自動提交的模式下工作,每個語句執行完后都會立即提交;Oracle則需要你包含一個提交語句。當一個語句通過OLEDB執行時,它執行完后一個提交動作會被附加上去。

例如:SQLServer數據庫T-SQL語句中顯示指定事務

declare@TranNamevarchar(20);

select@TranName='MyTransaction';

begintransaction@TranName;

useAdventureWorks;

deletefromAdventureWorks.HumanResources.JobCandidatewhereJobCandidateID=13;

committransactionMyTransaction;

go

或在存儲過程中使用

createprocedureTran1

begintran;

setxact_aborton;--setxact_aborton表示遇到錯誤立即回滾。

insertintoP_Category(CategoryId,Name)values('1','test1');

insertintoP_Category(CategoryId,Name)values('2','test2');

committran;

go

2、數據庫事務的優勢和限制

(1)優勢:

所有的事務邏輯包含在一個單獨的調用中。擁有運行一個事務的最佳性能。獨立于應用程序。

(2)限制:

事務上下文僅存在于數據庫調用中。數據庫代碼與數據庫系統有關。

三、ADO.Net事務

ADO.Net事務為System.Data.Common.DbTransaction類的各種派生類。ADO.Net事務不是分布式事務,不支持跨多個連接,它總是關聯到一個連接上的本地事務上。

ADO.NET顯式事務占用資源少、速度快,但功能簡單,只能管理單一對象和單一持久資源間的事務。

using(SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))

conn.Open();

using(SqlTransactiontran=conn.BeginTransaction())

using(SqlCommandcmd=newSqlCommand())

cmd.Connection=conn;

cmd.Transaction=tran;

cmd.CommandType=CommandType.Text;

cmd.CommandText="insertintoTranTable(Priority)values(1)";

cmd.ExecuteNonQuery();

cmd.CommandText="insertintoTranTable(Priority)values(256)";

cmd.ExecuteNonQuery();

tran.Commit();

Response.Write("Ok");

catch(SqlExceptionex)

tran.Rollback();

Response.Write("Error:"+ex.Message);

conn.Close();

}

四、System.EnterpriseServices自動事務處理

不需要顯示進行事務處理,運行庫自動創建事務。多個對象能輕松的運行在同一個事務中。但它需要COM+主機模型。

使用此技術的類必須派生自ServicedComponen類。

[Transaction(TransactionOption.Required)]

publicclassOrderContrl:ServicedComponent

[AutoComplete]

publicvoidNewOrder(Orderorder)

using(OrderDatadata=newOrderData())

data.Insert(order);

}

五、System.Transactions事務

System.Transactions是所有事務處理類的基類。

System.Transactions基礎結構通過支持SQLServer、ADO.NET、MSMQ和Microsoft分布式事務協調器(MSDTC)中啟動的事務,使得整個平臺的事務編程變得簡單和高效。

它既提供了基于Transaction類的顯式編程模型,也提供了使用TransactionScope類的隱式編程模型,它里面的事務由基礎設施自動管理。強烈建議使用更簡單的隱式開發模型TransactionScope。

1、顯式事務(ExplicitTransaction)

提交、回滾事務都由程序員編程來決定的方式,叫顯式事務(ExplicitTransaction)。Transaction類及其派生類為顯式事務。

2、Transaction類的派生類

CommittableTransaction:可提交的事務DependentTransaction:依賴事務SubordinateTransaction:可以委托的下屬事務

3、Transaction類成員

Current:獲取或設置環境事務。IsolationLevel:獲取事務的隔離級別。TransactionInformation:檢索有關某個事務的附加信息。DependentClone(DependentCloneOption):創建事務的依賴復本。Rollback():回滾(中止)事務。Dispose():釋放由該對象占用的資源。TransactionCompleted:指示事務已完成。

六、可提交的事務:CommitableTransaction(顯式事務)

唯一支持提交的事務類是CommitableTransaction,它直接繼承自Transaction。

CommittableTransaction提供了Commit同步方法和BeginCommit、EndCommit異步方法組合對事務的提交。

創建CommittableTransaction事務并不會自動設置環境事務。

CommittableTransaction事務不能被重用。可以將數據庫連接登記到事務。

注意:只有一個DbConnection時為本地事務;當存在多個DbConnection時才會啟動MSDTC(MSDTC不夠穩定,盡量避免引入分布式服務)

using(SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))

using(CommittableTransactionct=newCommittableTransaction())

conn.Open();

conn.EnlistTransaction(ct);//將數據庫連接登記到事務

using(SqlCommandcmd=newSqlCommand())

cmd.Connection=conn;

cmd.CommandType=CommandType.Text;

cmd.CommandText="insertintoTranTable(Priority)values(1)";

cmd.ExecuteNonQuery();

cmd.CommandText="insertintoTranTable(Priority)values(256)";

cmd.ExecuteNonQuery();

ct.Commit();//提交事務

Response.Write("Ok");

catch(SqlExceptionex)

ct.Rollback();//回滾事務

Response.Write("Error:"+ex.Message);

conn.Close();

}

七、環境事務:TrasactionScope(隱式事務,推薦)

TransactionScope為隱式事務。它為一組事務型操作創建一個執行范圍,而這個范圍始于TransactionScope創建之時,結束于TransactionScope被回收(調用Dispose方法)。

TransactionScope實現了IDisposable接口,除了Dispose方法之外,僅僅具有一個唯一的方法:Complete()。

目前TransactionScope只能處理數據庫的事務,對于其他事務,如I/O,目前的.NET版本無法處理。

using(SqlConnectionconn=newSqlConnection("DataSource=.;InitialCatalog=TestDb;IntegratedSecurity=SSPI;"))

using(TransactionScopets=newTransactionScope())

conn.Open();

SqlCommandcmd=newSqlCommand(conn);

cmd.CommandText="INSERTINTO[Test]([Name],[Value])VALUES('測試1','1')";

cmd.ExecuteNonQuery();

cmd.CommandText="INSERTINTO[Test]([Name],[Value])VALUES('測試2','2')";

cmd.ExecuteNonQuery();

ts.Complete();

catch(SqlException)

conn.Close();

}

TransactionScope卻有一組豐富的構造函數。我們先來看看這些構造函數相應的參數如何影響TransactionScope對事務控制的行為。

voidMain()

TransactionOptionstransactionOptions=newTransactionOptions()

IsolationLevel=System.Transactions.IsolationLevel.ReadCommitted,

Timeout=newTimeSpan(0,2,0)//超時間隔兩分鐘

using(TransactionScopescope=newTransactionScope(TransactionScopeOption.Required,transactionOptions))

Transaction.Current.TransactionCompleted+=(sender,args)=

Console.Write(args.Transaction.TransactionInformation.LocalIdentifier);

AddStudent(newStudent{});

scope.Complete();//提交事務

publicvoidAddStudent(Students)

SqlConnectionconn=newSqlConnection();//環境事務內新建的連接自動附加到事務

//如果連接在TransactionScope建立之前已存在,需要手工用conn.EnlistTrasaction(Transaction.Current)登記事務

conn.Open();

SqlCommandcommand=newSqlCommand();

catch(Exceptionex)

throw;

}

1、隔離級別IsolationLevel

7個隔離級別之中,Serializable具有最高隔離級別,代表的是一種完全基于序列化(同步)的數據存取方式。按照隔離級別至高向低,7個不同的隔離級別代表的含義如下:

Serializable:可序列化。(默認,最高級別)可以在事務期間讀取可變數據,但是不可以修改,也不可以添加任何新數據;RepeatableRead:可重復讀。可以在事務期間讀取可變數據,但是不可以修改。可以在事務期間添加新數據;ReadCommitted:可讀已提交的數據。不可以在事務期間讀取可變數據,但是可以修改它;ReadUncommitted:讀未提交的數據。可以在事務期間讀取和修改可變數據;Snapshot:快照。可以讀取可變數據。在事務修改數據之前,它驗證在它最初讀取數據之后另一個事務是否更改過這些數據。如果數據已被更新,則會引發錯誤。這樣使事務可獲取先前提交的數據值;Chaos:混亂。無法覆蓋隔離級別更高的事務中的掛起的更改;Unspecified:未指定。正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。如果設置了此值,則會引發異常。

2、嵌套環境事務

using(TransactionScopeouterScope=newTransactionScope())

using(TransactionScopeinnerScope=newTransactionScope(TransactionScopeOption.Required,transactionOptions))

//事務型操作

innerScope.Complete();

//事務型操作

outerScope.Complete();

}

3、TransactionScopeOption

使用TransactionScopeOptions可以改變TransactionScope的默認事務類型。

Required:(默認)如果已經存在一個事務,那么這個事務范圍將加入已有的事務。否則,它將創建自己的事務。RequiresNew:這個事務范圍將創建自己的事務。Suppress:抑制。將事務范圍內的環境事務設為空,意味著事務范圍內的操作并不受事務的控制。當部分代碼需要留在事務外部時,可以使用該選項。

4、MSDTC組件設置:

一般情況下只要你使用TransactionScope,都要配置MSDTC,要配防火墻,要開139端口,這個端口不可以更改。

如果WEB服務器和數據庫是在同一臺服務器上,TransactionScope使用的是本地事務,這時不需要配置MSDTC。如果WEB服務器和數據庫不在同一臺服務器上,TransactionScope會自動提升事務級別為分布式事務,這時就需要配置MSDTC。

對MSDTC組件設置:控制面板---管理工具---服務中,開啟DistributedTransactionCoordinator服務。

控制面板-管理工具-組件服務-計算機-我的電腦-右鍵-屬性,選擇MSDTC頁,確認使用本地協調器。點擊下方安全配置按鈕勾選:允許網絡DTC訪問,允許遠程客戶端,允許入站,允許出站,不要求進行身份驗證.對于數據庫服務器端,可選擇要求對呼叫方驗證勾選:啟用事務Internet協議(TIP)事務。在雙方防火墻中增加MSDTC.exe例外

可用命令行:netshfirewallsetallowedprogram%windir%/system32/msdtc.exeMSDTCenable

八、依賴事務DependentTransaction,跨多個線程調用事務(顯式事務)

一個環境事務綁定到一個線程上,如果新建了一個線程它就不會有第一個線程中的環境事務,兩個線程中的事務完全獨立。

如果多個線程使用同一個環境事務,需要給新線程傳遞一個依賴事務,調用Transaction的DependentClone方法創建依賴事務。

依賴事務通過DependentTransaction類型表示,和CommittableTransaction一樣,DependentTransaction也是Transaction的子類。

DependentTransaction依賴于現有的Transaction對象而存在,相當于被依賴事務的子事務,具有一個唯一的方法成員:Complete。調用這個方法意味著向被依賴事務發送通知,表明所有與依賴事務相關的操作已經完成。

DependentClone方法具有一個DependentCloneOption枚舉類型的參數:

BlockCommitUntilComplete:表示被依賴事務在提

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論