事務(wù)在c#中的使用_第1頁
事務(wù)在c#中的使用_第2頁
事務(wù)在c#中的使用_第3頁
事務(wù)在c#中的使用_第4頁
事務(wù)在c#中的使用_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

一、概述

1、事務(wù)ACID特性

事務(wù)將一系列的工作視為一個(gè)工作單元,它具有ACID特性:

A:Atomicity不可分性

也就是說事務(wù)中有多項(xiàng)工作,如果有一項(xiàng)工作失敗了,整個(gè)事務(wù)就算失敗了。C:Consistency一致性

事務(wù)完成時(shí),全部數(shù)據(jù)必須維持一致性的狀態(tài)。對于關(guān)系數(shù)據(jù)庫,簡單地來說就是沒有破壞數(shù)據(jù)完整性。I:Isolation隔離性

事務(wù)與其他事務(wù)是隔離的,也就是說一個(gè)事務(wù)的一項(xiàng)工作對數(shù)據(jù)進(jìn)行修改時(shí),如果整個(gè)事務(wù)還沒有結(jié)束,其他事務(wù)就無法知道這個(gè)數(shù)據(jù)發(fā)生了修改。D:Durability持久性

事務(wù)完成后,其作用便永遠(yuǎn)存在于系統(tǒng)之中。

2、.NET開發(fā)者用到的5種事務(wù)機(jī)制:

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

這5種事務(wù)機(jī)制有著各自的優(yōu)勢和劣勢,分別表現(xiàn)在性能、代碼數(shù)量和部署設(shè)置等方面。開發(fā)人員可以根據(jù)項(xiàng)目的實(shí)際情況選擇相應(yīng)的事務(wù)機(jī)制。

二、數(shù)據(jù)庫事務(wù)

1、不同數(shù)據(jù)庫的事務(wù)規(guī)則

數(shù)據(jù)庫事務(wù)是其他事務(wù)模型的基礎(chǔ),當(dāng)一個(gè)事務(wù)創(chuàng)建時(shí)不同數(shù)據(jù)庫系統(tǒng)都有自己的規(guī)則。

SQLServer默認(rèn)在自動(dòng)提交的模式下工作,每個(gè)語句執(zhí)行完后都會(huì)立即提交;Oracle則需要你包含一個(gè)提交語句。當(dāng)一個(gè)語句通過OLEDB執(zhí)行時(shí),它執(zhí)行完后一個(gè)提交動(dòng)作會(huì)被附加上去。

例如:SQLServer數(shù)據(jù)庫T-SQL語句中顯示指定事務(wù)

declare@TranNamevarchar(20);

select@TranName='MyTransaction';

begintransaction@TranName;

useAdventureWorks;

deletefromAdventureWorks.HumanResources.JobCandidatewhereJobCandidateID=13;

committransactionMyTransaction;

go

或在存儲(chǔ)過程中使用

createprocedureTran1

begintran;

setxact_aborton;--setxact_aborton表示遇到錯(cuò)誤立即回滾。

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

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

committran;

go

2、數(shù)據(jù)庫事務(wù)的優(yōu)勢和限制

(1)優(yōu)勢:

所有的事務(wù)邏輯包含在一個(gè)單獨(dú)的調(diào)用中。擁有運(yùn)行一個(gè)事務(wù)的最佳性能。獨(dú)立于應(yīng)用程序。

(2)限制:

事務(wù)上下文僅存在于數(shù)據(jù)庫調(diào)用中。數(shù)據(jù)庫代碼與數(shù)據(jù)庫系統(tǒng)有關(guān)。

三、ADO.Net事務(wù)

ADO.Net事務(wù)為System.Data.Common.DbTransaction類的各種派生類。ADO.Net事務(wù)不是分布式事務(wù),不支持跨多個(gè)連接,它總是關(guān)聯(lián)到一個(gè)連接上的本地事務(wù)上。

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

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自動(dòng)事務(wù)處理

不需要顯示進(jìn)行事務(wù)處理,運(yùn)行庫自動(dòng)創(chuàng)建事務(wù)。多個(gè)對象能輕松的運(yùn)行在同一個(gè)事務(wù)中。但它需要COM+主機(jī)模型。

使用此技術(shù)的類必須派生自ServicedComponen類。

[Transaction(TransactionOption.Required)]

publicclassOrderContrl:ServicedComponent

[AutoComplete]

publicvoidNewOrder(Orderorder)

using(OrderDatadata=newOrderData())

data.Insert(order);

}

五、System.Transactions事務(wù)

System.Transactions是所有事務(wù)處理類的基類。

System.Transactions基礎(chǔ)結(jié)構(gòu)通過支持SQLServer、ADO.NET、MSMQ和Microsoft分布式事務(wù)協(xié)調(diào)器(MSDTC)中啟動(dòng)的事務(wù),使得整個(gè)平臺(tái)的事務(wù)編程變得簡單和高效。

它既提供了基于Transaction類的顯式編程模型,也提供了使用TransactionScope類的隱式編程模型,它里面的事務(wù)由基礎(chǔ)設(shè)施自動(dòng)管理。強(qiáng)烈建議使用更簡單的隱式開發(fā)模型TransactionScope。

1、顯式事務(wù)(ExplicitTransaction)

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

2、Transaction類的派生類

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

3、Transaction類成員

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

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

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

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

創(chuàng)建CommittableTransaction事務(wù)并不會(huì)自動(dòng)設(shè)置環(huán)境事務(wù)。

CommittableTransaction事務(wù)不能被重用??梢詫?shù)據(jù)庫連接登記到事務(wù)。

注意:只有一個(gè)DbConnection時(shí)為本地事務(wù);當(dāng)存在多個(gè)DbConnection時(shí)才會(huì)啟動(dòng)MSDTC(MSDTC不夠穩(wěn)定,盡量避免引入分布式服務(wù))

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

using(CommittableTransactionct=newCommittableTransaction())

conn.Open();

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

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();//提交事務(wù)

Response.Write("Ok");

catch(SqlExceptionex)

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

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

conn.Close();

}

七、環(huán)境事務(wù):TrasactionScope(隱式事務(wù),推薦)

TransactionScope為隱式事務(wù)。它為一組事務(wù)型操作創(chuàng)建一個(gè)執(zhí)行范圍,而這個(gè)范圍始于TransactionScope創(chuàng)建之時(shí),結(jié)束于TransactionScope被回收(調(diào)用Dispose方法)。

TransactionScope實(shí)現(xiàn)了IDisposable接口,除了Dispose方法之外,僅僅具有一個(gè)唯一的方法:Complete()。

目前TransactionScope只能處理數(shù)據(jù)庫的事務(wù),對于其他事務(wù),如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卻有一組豐富的構(gòu)造函數(shù)。我們先來看看這些構(gòu)造函數(shù)相應(yīng)的參數(shù)如何影響TransactionScope對事務(wù)控制的行為。

voidMain()

TransactionOptionstransactionOptions=newTransactionOptions()

IsolationLevel=System.Transactions.IsolationLevel.ReadCommitted,

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

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

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

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

AddStudent(newStudent{});

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

publicvoidAddStudent(Students)

SqlConnectionconn=newSqlConnection();//環(huán)境事務(wù)內(nèi)新建的連接自動(dòng)附加到事務(wù)

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

conn.Open();

SqlCommandcommand=newSqlCommand();

catch(Exceptionex)

throw;

}

1、隔離級別IsolationLevel

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

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

2、嵌套環(huán)境事務(wù)

using(TransactionScopeouterScope=newTransactionScope())

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

//事務(wù)型操作

innerScope.Complete();

//事務(wù)型操作

outerScope.Complete();

}

3、TransactionScopeOption

使用TransactionScopeOptions可以改變TransactionScope的默認(rèn)事務(wù)類型。

Required:(默認(rèn))如果已經(jīng)存在一個(gè)事務(wù),那么這個(gè)事務(wù)范圍將加入已有的事務(wù)。否則,它將創(chuàng)建自己的事務(wù)。RequiresNew:這個(gè)事務(wù)范圍將創(chuàng)建自己的事務(wù)。Suppress:抑制。將事務(wù)范圍內(nèi)的環(huán)境事務(wù)設(shè)為空,意味著事務(wù)范圍內(nèi)的操作并不受事務(wù)的控制。當(dāng)部分代碼需要留在事務(wù)外部時(shí),可以使用該選項(xiàng)。

4、MSDTC組件設(shè)置:

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

如果WEB服務(wù)器和數(shù)據(jù)庫是在同一臺(tái)服務(wù)器上,TransactionScope使用的是本地事務(wù),這時(shí)不需要配置MSDTC。如果WEB服務(wù)器和數(shù)據(jù)庫不在同一臺(tái)服務(wù)器上,TransactionScope會(huì)自動(dòng)提升事務(wù)級別為分布式事務(wù),這時(shí)就需要配置MSDTC。

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

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

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

八、依賴事務(wù)DependentTransaction,跨多個(gè)線程調(diào)用事務(wù)(顯式事務(wù))

一個(gè)環(huán)境事務(wù)綁定到一個(gè)線程上,如果新建了一個(gè)線程它就不會(huì)有第一個(gè)線程中的環(huán)境事務(wù),兩個(gè)線程中的事務(wù)完全獨(dú)立。

如果多個(gè)線程使用同一個(gè)環(huán)境事務(wù),需要給新線程傳遞一個(gè)依賴事務(wù),調(diào)用Transaction的DependentClone方法創(chuàng)建依賴事務(wù)。

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

DependentTransaction依賴于現(xiàn)有的Transaction對象而存在,相當(dāng)于被依賴事務(wù)的子事務(wù),具有一個(gè)唯一的方法成員:Complete。調(diào)用這個(gè)方法意味著向被依賴事務(wù)發(fā)送通知,表明所有與依賴事務(wù)相關(guān)的操作已經(jīng)完成。

DependentClone方法具有一個(gè)DependentCloneOption枚舉類型的參數(shù):

BlockCommitUntilComplete:表示被依賴事務(wù)在提

溫馨提示

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

評論

0/150

提交評論