




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025照明設(shè)備購銷合同協(xié)議書
- 農(nóng)村房屋賣房合同范例
- 公墓產(chǎn)品采購合同范例
- 農(nóng)村單包工合同范例
- 公司資質(zhì)租賃合同范例
- 農(nóng)田改造推土合同范例
- 2025年體育教育與運(yùn)動(dòng)訓(xùn)練考試卷及答案
- 2025商業(yè)房產(chǎn)人民幣抵押貸款合同范本
- 2025年網(wǎng)絡(luò)安全與信息保護(hù)師考試試卷及答案
- 2025商務(wù)租賃合同杰出模板
- 空地或鋪面出租合同協(xié)議
- 2025年全國保密教育線上培訓(xùn)考試試題庫及答案【網(wǎng)校專用】含答案詳解
- 華為管理面試題及答案
- 2024年廣州醫(yī)科大學(xué)校本部招聘工作人員筆試真題
- 初中2年級家長會(huì)課件
- 2025餐飲轉(zhuǎn)讓合同協(xié)議書 餐飲轉(zhuǎn)讓合同協(xié)議書范本
- 2024-2025學(xué)年統(tǒng)編版小學(xué)道德與法治三年級下冊期中考試測試卷附答案
- 智能垃圾桶設(shè)計(jì)方案資料
- 新聞報(bào)道的寫作及范例課件
- 危重病人的搶救與配合 2
- 2025-2030中國CAD-CAM牙科系統(tǒng)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報(bào)告
評論
0/150
提交評論