NET開發(fā)中的事務(wù)處理大比拼_第1頁
NET開發(fā)中的事務(wù)處理大比拼_第2頁
NET開發(fā)中的事務(wù)處理大比拼_第3頁
NET開發(fā)中的事務(wù)處理大比拼_第4頁
NET開發(fā)中的事務(wù)處理大比拼_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.NET開發(fā)中的事務(wù)處理大比拼 事務(wù)是一組組合成邏輯工作單元的數(shù)據(jù)庫操作,在系統(tǒng)執(zhí)行過程中可能會出錯,但事務(wù)將控制和維護每個數(shù)據(jù)庫的一致性和完整性。事務(wù)處理的主要特征是,任務(wù)要么全部完成,要么都不完成。在寫入一些記錄時,要么寫入所有記錄,要么什么都不寫入。如果在寫入一個記錄時出現(xiàn)了一個失敗,那么在事務(wù)處理中已寫入的其他數(shù)據(jù)就會回滾。事務(wù)可能由很多單個任務(wù)構(gòu)成。簡單事務(wù)的一個常見例子:把錢從A賬戶轉(zhuǎn)到B賬戶,這涉及兩項任務(wù),即從A賬戶把錢取出來;把錢存入B賬戶。兩項任務(wù)要么同時成功,要么一起失敗,給予回滾,以便保持賬戶的狀態(tài)和原來相同。否則,在執(zhí)行某一個操作的時候可能會因為停電、網(wǎng)絡(luò)中斷等原因而

2、出現(xiàn)故障,所以有可能更新了一個表中的行,但沒有更新相關(guān)表中的行。如果數(shù)據(jù)庫支持事務(wù),則可以將數(shù)據(jù)庫操作組成一個事務(wù),以防止因這些事件而使數(shù)據(jù)庫出現(xiàn)不一致。事務(wù)的ACID屬性如下。l 原子性(Atomicity):事務(wù)的所有操作是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。原子性消除了系統(tǒng)處理操作子集的可能性。l 一致性(Consistency):數(shù)據(jù)從一種正確狀態(tài)轉(zhuǎn)換到另一種正確狀態(tài)。事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。當(dāng)事務(wù)結(jié)束時,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都必須是正確的。在存款取款的例子中,邏輯規(guī)則是,錢

3、是不能憑空產(chǎn)生或銷毀的,對于每個(收支)條目必須有一個相應(yīng)的抵衡條目產(chǎn)生,以保證賬戶是平的。l 隔離性(Isolation):由并發(fā)事務(wù)所作的修改必須與任何其他并發(fā)事務(wù)所作的修改隔離。查看數(shù)據(jù)時數(shù)據(jù)所處的狀態(tài),要么是事務(wù)修改它之前的狀態(tài),要么是事務(wù)修改它之后的狀態(tài)。簡單的理解就是,防止多個并發(fā)更新彼此干擾。事務(wù)在操作數(shù)據(jù)時與其他事務(wù)操作隔離。隔離性一般是通過加鎖的機制來實現(xiàn)的。l 持久性(Durability):事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的。已提交的更改即使在發(fā)生故障時也依然存在。對于事務(wù)的開發(fā),.NET平臺也為我們提供了幾種非常簡單方便的事務(wù)機制。無論是在功能上還是性能上都提供了

4、優(yōu)秀的企業(yè)級事務(wù)支持。.NET開發(fā)者可以使用以下5種事務(wù)機制:l SQL和存儲過程級別的事務(wù)。l ADO.NET級別的事務(wù)。l ASP.NET頁面級別的事務(wù)。l 企業(yè)級服務(wù)COM+事務(wù)。l System.Transactions 事務(wù)處理。這5種事務(wù)機制有著各自的優(yōu)勢和劣勢,分別表現(xiàn)在性能、代碼數(shù)量和部署設(shè)置等方面。開發(fā)人員可以根據(jù)項目的實際情況選擇相應(yīng)的事務(wù)機制。下面就開始分別說明日常開發(fā)中5種事務(wù)的具體使用。1 .NET開發(fā)中的事務(wù)處理大比拼 之 SQL和存儲過程級別事務(wù)2 .NET開發(fā)中的事務(wù)處理大比拼 之 ADO.NET級別的事務(wù) 3 .NET開發(fā)中的事務(wù)處理大比拼 之 ASP.NET

5、頁面級別的事務(wù)4 .NET開發(fā)中的事務(wù)處理大比拼 之 企業(yè)級服務(wù)COM+事務(wù)5 .NET開發(fā)中的事務(wù)處理大比拼 之 System.Transactions .NET開發(fā)中的事務(wù)處理大比拼 之 SQL和存儲過程級別事務(wù) 數(shù)據(jù)庫事務(wù)是其他事務(wù)模型的基礎(chǔ),當(dāng)一個事務(wù)創(chuàng)建時不同數(shù)據(jù)庫系統(tǒng)都有自己的規(guī)則。SQL Server默認在自動提交的模式下工作,每個語句執(zhí)行完后都會立即提交;與此對照的是Oracle需要你包含一個提交語句。但是當(dāng)一個語句通過OLE DB執(zhí)行時,它執(zhí)行完后一個提交動作會被附加上去。例如:DECLARE TranName VARCHAR(20);SELECT TranName = My

6、Transaction;BEGIN TRANSACTION TranName;GOUSE AdventureWorks;GODELETE FROM AdventureWorks.HumanResources.JobCandidate WHERE JobCandidateID = 13;GO COMMIT TRANSACTION MyTransaction;GO或者:CREATE PROCEDURE Tran1 as begin tran set xact_abort on Insert Into P_Category(CategoryId,Name)values(1,test1) Insert

7、 Into P_Category(CategoryId,Name)values(2,test2) commit tran GOset xact_abort on表示遇到錯誤立即回滾。當(dāng)然你也可以這么寫:CREATE PROCEDURE tran1 as begin tran Insert Into P_Category(CategoryId,Name)values(1,test1) if(error0) rollback tran else begin Insert Into P_Category(CategoryId,Name)values(2,test2) if(error0) rollb

8、ack tran else commit tran end GO數(shù)據(jù)庫級別事務(wù)有它的優(yōu)勢和限制。優(yōu)勢:l 所有的事務(wù)邏輯包含在一個單獨的調(diào)用中。l 擁有運行一個事務(wù)的最佳性能。l 獨立于應(yīng)用程序。限制:l 事務(wù)上下文僅存在于數(shù)據(jù)庫調(diào)用中。l 數(shù)據(jù)庫代碼與數(shù)據(jù)庫系統(tǒng)有關(guān)。.NET開發(fā)中的事務(wù)處理大比拼 之 ADO.NET級別的事務(wù) 現(xiàn)在我們對事務(wù)的概念和原理都有所了解了,并且作為已經(jīng)有一些基礎(chǔ)的C#開發(fā)者,我們已經(jīng)熟知編寫數(shù)據(jù)庫交互程序的一些要點,即:(1)使用SqlConnection類的對象的Open()方法建立與數(shù)據(jù)庫服務(wù)器的連接。(2)然后將該連接賦給SqlCommand對象的Conne

9、ction屬性。(3)將欲執(zhí)行的SQL語句賦給SqlCommand的CommandText屬性。(4)通過SqlCommand對象進行數(shù)據(jù)庫操作。創(chuàng)建一個ADO.NET事務(wù)是很簡單的,需要定義一個SqlTransaction類型的對象。SqlConnection 和OleDbConnection對象都有一個 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 對象。然后賦給SqlCommand對象的Transcation屬性,即實現(xiàn)了二者的關(guān)聯(lián)。為了使事務(wù)處理可以成功完成,必須調(diào)用SqlTransaction對象的Commit

10、()方法。如果有錯誤,則必須調(diào)用Rollback()方法撤銷所有的操作。代碼示例:基于以上認識,下面我們就開始動手寫一個基于ADO.NET的事務(wù)處理程序。 (示例位置:光盤codech0504WebWebForm2)string conString = data source=;database=codematic;user id=sa;password=;SqlConnection myConnection = new SqlConnection(conString);myConnection.Open();/啟動一個事務(wù)SqlTransaction myTrans = m

11、yConnection.BeginTransaction();/為事務(wù)創(chuàng)建一個命令SqlCommand myCommand = new SqlCommand();myCommand.Connection = myConnection;myCommand.Transaction = myTrans;try myCommand.CommandText = update P_Product set Name=電腦2 where Id=52; myCommand.ExecuteNonQuery(); myCommand.CommandText = update P_Product set Name=電

12、腦3 where Id=53; myCommand.ExecuteNonQuery(); myTrans.Commit();/提交 Response.Write(兩條數(shù)據(jù)更新成功);catch (Exception ex) myTrans.Rollback();/遇到錯誤,回滾 Response.Write(ex.ToString(); finally myConnection.Close();ADO.NET事務(wù)的優(yōu)勢和限制如下。優(yōu)勢:l 簡單。l 和數(shù)據(jù)庫事務(wù)差不多快。l 事務(wù)可以跨越多個數(shù)據(jù)庫訪問。l 獨立于數(shù)據(jù)庫,不同數(shù)據(jù)庫的專有代碼被隱藏了。限制:事務(wù)執(zhí)行在數(shù)據(jù)庫連接層上,所以需要在執(zhí)

13、行事務(wù)的過程中手動地維護一個連接。注 意所有命令都必須關(guān)聯(lián)在同一個連接實例上,ADO.NET事務(wù)處理不支持跨多個連接的事務(wù)處理。.NET開發(fā)中的事務(wù)處理大比拼 之 ASP.NET頁面級別的事務(wù) ASP.NET事務(wù)可以說是在.NET平臺上事務(wù)實現(xiàn)方式最簡單的一種,你僅僅需要一行代碼即可。在aspx的頁面聲明中加一個額外的屬性,即事務(wù)屬性Transaction=Required,它有如下的值:Disabled(默認)、NotSupported、Supported、Required和RequiresNew,這些設(shè)置和COM+及企業(yè)級服務(wù)中的設(shè)置一樣,典型的一個例子是如果你想在頁面上下文中運行事務(wù),那

14、么要將其設(shè)置為Required。如果頁面中包含有用戶控件,那么這些控件也會包含到事務(wù)中,事務(wù)會存在于頁面的每個地方。 代碼示例:頁面聲明Transaction=Required:頁面引用:using System.EnterpriseServices;。然后,數(shù)據(jù)操作代碼:protected void Button1_Click(object sender, EventArgs e) try Work1(); Work2(); ContextUtil.SetComplete();/提交事務(wù) catch (System.Exception except) ContextUtil.SetAbort

15、();/撤銷事務(wù) Response.Write(except.Message); private void Work1() string conString = data source=;database=codematic;user id=sa;password=; SqlConnection myConnection = new SqlConnection(conString); string strSql = Insert Into P_Category(CategoryId,Name)values(1,test1); SqlCommand myCommand = ne

16、w SqlCommand(strSql, myConnection); myConnection.Open(); int rows = myCommand.ExecuteNonQuery(); myConnection.Close();private void Work2() string conString = data source=;database=codematic;user id=sa;password=; SqlConnection myConnection = new SqlConnection(conString); string strSql = Inse

17、rt Into P_Category(CategoryId,Name)values(2,test2); SqlCommand myCommand = new SqlCommand(strSql, myConnection); myConnection.Open(); int rows = myCommand.ExecuteNonQuery(); myConnection.Close();ContextUtil是用于獲取 COM+ 上下文信息的首選類。由于此類的成員全部為static,因此在使用其成員之前不需要對此類進行實例化。ASP.NET頁面事務(wù)的優(yōu)勢和限制如下。l 優(yōu)勢:實現(xiàn)簡單,不需要額

18、外的編碼。 l限制:頁面的所有代碼都是同一個事務(wù),這樣的事務(wù)可能會很大,而也許我們需要的是分開的、小的事務(wù)實現(xiàn)在Web層。.NET開發(fā)中的事務(wù)處理大比拼 之 企業(yè)級服務(wù)COM+事務(wù) .NET Framework 依靠 MTS/COM+ 服務(wù)來支持自動事務(wù)處理。COM+ 使用 Microsoft Distributed Transaction Coordinator(DTC)作為事務(wù)管理器和事務(wù)協(xié)調(diào)器在分布式環(huán)境中運行事務(wù)。這樣可使 .NET 應(yīng)用程序運行跨多個資源結(jié)合不同操作(例如將定單插入SQL Server 數(shù)據(jù)庫、將消息寫入 Microsoft 消息隊列(MSMQ)隊列,以及從 Orac

19、le 數(shù)據(jù)庫檢索數(shù)據(jù))的事務(wù)。要實現(xiàn)COM+事務(wù)處理的類則必須繼承System.EnterpriseServices.ServicedComponent,這些類需要是公共的,并且需要提供一個公共的默認的構(gòu)造器。其實Web Service就是繼承ServicedComponent,所以Web Service也支持COM+事務(wù)。要在類定義之前加屬性Transaction(TransactionOption.Required)。類里面的每個方法都會運行在一個事務(wù)中。定義一個COM+事務(wù)處理的類:首先引用:using System.EnterpriseServices;。然后,繼承ServicedCo

20、mponent。Transaction(TransactionOption.Required)public class OrderData : ServicedComponentTransactionOption枚舉類型支持5個值:Disabled、NotSupported、Required、RequiresNew和Supported,如表5-3所示。表5-3 TransactionOption枚舉類型支持5個值值說 明Disabled忽略當(dāng)前上下文中的任何事務(wù)NotSupported使用非受控事務(wù)在上下文中創(chuàng)建組件Required如果事務(wù)存在則共享事務(wù),并且如有必要則創(chuàng)建新事務(wù)Require

21、sNew使用新事務(wù)創(chuàng)建組件,而與當(dāng)前上下文的狀態(tài)無關(guān)Supported如果事務(wù)存在,則共享該事務(wù)一般來說COM+中的組件需要Required 或Supported。當(dāng)組件用于記錄或查賬時RequiresNew 很有用,因為組件應(yīng)該與活動中其他事務(wù)處理的提交或回滾隔離開來。派生類可以重載基類的任意屬性。如OrderData選用Required,派生類仍然可以重載并指定RequiresNew或其他值。 COM+事務(wù)有手動處理和自動處理兩種方式,自動處理就是在所需要自動處理的方法前加上AutoComplete,根據(jù)方法的正?;驋伋霎惓Q定提交或回滾。手動處理就是調(diào)用ContextUtil類中的Ena

22、bleCommit、SetComplete和SetAbort方法。實現(xiàn)步驟如下。1給程序添加強名1)創(chuàng)建一對密鑰 用來創(chuàng)建密鑰的工具是稱為sn.exe的共享工具。通常通過命令提示運行它,該工具可執(zhí)行各種任務(wù)以生成并提取密鑰。我們需要用以下方式來運行sn.exe。 sn k c:key.snk 其中key.snk 代表將保存密鑰的文件的名稱。它的名稱可以是任意的,不過習(xí)慣上帶有.snk后綴名。 2)簽名 這個文件必須在AssemblyKeyFile屬性中引用,簽名通常是在編譯時進行的。簽名時,用戶可利用C屬性通知編譯器應(yīng)該使用正確的密鑰文件對DLL進行簽名。要做到這一點用戶需要打開工程中的Ass

23、emblyInfo.cs文件并進行修改。 assembly:AssemblyKeyFile(“.key.snk”) 注 意key.snk文件和項目文件在同一個文件夾內(nèi)。2手動事務(wù)處理創(chuàng)建一個項目用以實現(xiàn)事務(wù)處理的業(yè)務(wù)類ClassTran。代碼示例: (示例位置:光盤codech0504ClassTranOrderData1) using System;using System.Data.SqlClient;using System.EnterpriseServices; /企業(yè)級服務(wù)COM+事務(wù)namespace ClassTran Transaction(TransactionOption.

24、Required) public class OrderData1 : ServicedComponent /手動事務(wù) public string WorkTran() try ContextUtil.EnableCommit(); Work1(); Work2(); ContextUtil.SetComplete(); return 成功!; catch (Exception ex) ContextUtil.SetAbort(); return 失敗!; private void Work1() string conString = data source=;databas

25、e=codematic;user id=sa;password=; SqlConnection myConnection = new SqlConnection(conString); string strSql = Insert Into P_Category(CategoryId,Name)values(1,test1); SqlCommand myCommand = new SqlCommand(strSql, myConnection); myConnection.Open(); int rows = myCommand.ExecuteNonQuery(); myConnection.

26、Close(); private void Work2() string conString = data source=;database=codematic;user id=sa;password=; SqlConnection myConnection = new SqlConnection(conString); string strSql = Insert Into P_Category(CategoryId,Name)values(2,test2); SqlCommand myCommand = new SqlCommand(strSql, myConnectio

27、n); myConnection.Open(); int rows = myCommand.ExecuteNonQuery(); myConnection.Close(); 3自動事務(wù)處理代碼示例:在方法之前增加屬性AutoComplete(true),這樣如果方法執(zhí)行時沒有異常就默認提交,如果有異常則這個方法就會回滾。 (示例位置:光盤codech0504ClassTranOrderData2)using System;using System.Data.SqlClient;using System.EnterpriseServices;/企業(yè)級服務(wù)COM+事務(wù)namespace Class

28、Tran Transaction(TransactionOption.Required) public class OrderData2 : ServicedComponent /自動事務(wù) AutoComplete(true) public string WorkTran() string msg = ; string conString = data source=;database=codematic;user id=sa;password=; SqlConnection myConnection = new SqlConnection(conString); myCon

29、nection.Open(); SqlCommand myCommand = new SqlCommand(); myCommand.Connection = myConnection; try myCommand.CommandText = update P_Product set Name=電腦2 where Id=52; myCommand.ExecuteNonQuery(); myCommand.CommandText = update P_Product set Name=電腦3 where Id=53; myCommand.ExecuteNonQuery(); msg =成功!;

30、catch (Exception ex) msg = 失敗:+ex.Message; finally myConnection.Close(); return msg; 4事務(wù)方法調(diào)用代碼示例: (示例位置:光盤codech0504WebWebForm4.aspx)protected void Button1_Click(object sender, EventArgs e) ClassTran.OrderData1 od1 = new ClassTran.OrderData1(); od1.WorkTran();protected void Button2_Click(object send

31、er, EventArgs e) ClassTran.OrderData2 od2 = new ClassTran.OrderData2(); od2.WorkTran();在需要事務(wù)跨 MSMQ 和其他可識別事務(wù)的資源(例如SQL Server 數(shù)據(jù)庫)運行的系統(tǒng)中,只能使用 DTC 或 COM+ 事務(wù),除此之外沒有其他選擇。DTC 協(xié)調(diào)參與分布式事務(wù)的所有資源管理器,也管理與事務(wù)相關(guān)的操作。企業(yè)級服務(wù)COM+事務(wù)的前提及優(yōu)缺點如下。前提:l 需要強名字。l 使用事務(wù)的對象需要繼承ServicedComponent。優(yōu)勢:l 執(zhí)行分布式事務(wù),多個對象可以輕松地運行在同一個事務(wù)處理中,事務(wù)處理

32、還可以自動登記。l 獲得COM+服務(wù),諸如對象構(gòu)建和對象池等。缺點:l 由于存在 DTC 和 COM 互操作性開銷,導(dǎo)致性能降低。l COM+ 1.0要求每個事務(wù)的隔離級別都設(shè)置為Serializable。l 使用Enterprise Services的事務(wù)總是線程安全的, 也就是說你無法讓多個線程參與到同一個事務(wù)中。.NET開發(fā)中的事務(wù)處理大比拼 之 System.Transactions 在 .NET Framework 2.0中增加了System.Transactions,這是一種新的命名空間,完全專注于控制事務(wù)性行為。引入了執(zhí)行事務(wù)性工作的更簡單方法及一些新的性能優(yōu)化。System.T

33、ransactions提供了一個“輕量級”的、易于使用的Transaction框架。在上節(jié)中,要實現(xiàn)Transaction需要利用EnterpriseServices,讓組件從ServiceComponent繼承下來。而通過System.Transactions,則只要簡單的幾行代碼,不需要繼承,不需要Attribute標記。用戶根本不需要考慮是簡單事務(wù)還是分布式事務(wù)。新模型會自動根據(jù)事務(wù)中涉及的對象資源判斷使用何種事務(wù)管理器。簡而言之,對于任何的事務(wù),用戶只要使用同一種方法進行處理即可。下面介紹System.Transactions的幾種用法。首先要引用:using System.Trans

34、actions;。其次,將事務(wù)操作代碼放在TransactionScope中執(zhí)行。如: using (TransactionScope ts = new TransactionScope() /事務(wù)操作代碼 ts.Complete();代碼示例:這是最簡單,也是最常見的用法。創(chuàng)建了新的 TransactionScope 對象后,即開始創(chuàng)建事務(wù)范圍。如代碼示例所示,建議使用 using 語句創(chuàng)建范圍。位于 using 塊內(nèi)的所有操作將成為一個事務(wù)的一部分,因為它們共享其所定義的事務(wù)執(zhí)行上下文。本例中的最后一行,調(diào)用 TransactionScope 的 Complete 方法,將導(dǎo)致退出該塊時請

35、求提交該事務(wù)。此方法還提供了內(nèi)置的錯誤處理,出現(xiàn)異常時會終止事務(wù)。 (示例位置:光盤codech0504ClassTranOrderData3)using (TransactionScope ts = new TransactionScope()/使整個代碼塊成為事務(wù)性代碼 #region 在這里編寫需要具備Transaction的代碼 string msg = ; string conString = data source=;database=codematic;user id=sa;password=; SqlConnection myConnection = new

36、SqlConnection(conString); myConnection.Open(); SqlCommand myCommand = new SqlCommand(); myCommand.Connection = myConnection; try myCommand.CommandText = update P_Product set Name=電腦2 where Id=52; myCommand.ExecuteNonQuery(); myCommand.CommandText = update P_Product set Name=電腦3 where Id=53; myComman

37、d.ExecuteNonQuery(); msg = 成功!; catch (Exception ex) msg = 失敗: + ex.Message; finally myConnection.Close(); #endregion ts.Complete(); return msg; 上面的代碼演示了在一個Transaction Scope里面打開一個數(shù)據(jù)庫連接的過程。這個數(shù)據(jù)庫連接由于處在一個Transaction Scope里面,所以會自動獲得Transaction的能力。如果這里數(shù)據(jù)庫連接的是SQL Server 2005,那么這個Transaction將不會激活一個MSDTC管理的

38、分布式事務(wù),而是會由.NET創(chuàng)建一個Local Transaction,性能非常高。但是如果是SQL Server 2000,則會自動激活一個分布式事務(wù),在性能上會受一定的損失。再看下面的例子:void MethodMoreConn() using (TransactionScope ts = new TransactionScope() using (SqlConnection conn = new SqlConnection(conString1) conn.Open(); using (SqlConnection conn2 = new SqlConnection(conString2)

39、 conn2.Open(); ts.Complete(); 這個例子更加充分地說明了Transaction Scope的強大,兩個數(shù)據(jù)庫連接!雖然上面的conn和conn2是兩個不同的連接對象,可能分別連接到不同的數(shù)據(jù)庫,但是由于它們處在一個TransactionScope中,它們就具備了“聯(lián)動”的Transaction能力。在這里,將自動激活一個MSDTC管理的分布式事務(wù)(可以通過打開【管理工具】里面的組件服務(wù),來查看當(dāng)前的分布式事務(wù)列表)。1在分布式事務(wù)中登記ADO.NET 2.0 中的新增功能支持使用 EnlistTransaction 方法在分布式事務(wù)中登記。由于 EnlistTran

40、saction 在 Transaction 實例中登記連接,因此,該方法利用 System.Transactions 命名空間中的可用功能來管理分布式事務(wù),從而比使用 System.EnterpriseServices. ITransaction 對象的 EnlistDistributedTransaction 更可取。此外,其語義也稍有不同:在一個事務(wù)中顯式登記了某個連接后,如果第一個事務(wù)尚未完成,則無法取消登記或在另一個事務(wù)中登記該連接。void MethodEnlist() CommittableTransaction tx = new CommittableTransaction(); using (

溫馨提示

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

評論

0/150

提交評論