深入講解ADO.NET事務處理方法
ADO.NET經過長時間的發展,很多用戶都很了解ADO.NET了,這里我發表一下個人理解,和大家討論討論。我們先來分析一下連接池的概念吧,然后在具體的人系事務處理的方法。創建:OLE DB .NET 數據提供程序使用 OLE DB 會話池來自動管理連接池,當連接打開時,將根據一種精確的匹配算法來創建連接池,該算法會使連接池與連接中的字符串相關聯。每個連接池都與一個不同的連接字符串相關聯。當新連接打開時,如果連接字符串不精確匹配現有池,則將創建一個新池。連接池是為每個唯一的連接字符串創建的。當創建一個池后,將創建多個連接對象并將其添加到該池中,以滿足最小池大小的要求。連接將根據需要添加到池中,直至達到***池大小。
#T#移除:如果連接生存期已過或者池管理程序檢測到與服務器的連接已被斷開,則對象池管理程序將從池中移除該連接。請注意,只有在嘗試與服務器進行通訊后,才可以檢測到這種情況。如果發現某連接不再連接到服務器,則會將其標記為無效。對象池管理程序會定期掃描連接池,以查找已被釋放到池中并標記為無效的對象。找到后,這些連接將被***移除。在編程過程中盡可能短的時間使用連接,要及時的關閉連接。關閉連接后,自動放入連接池。PB必須手工實現事務處理,如回滾等。
ADO.NET事務處理方法:
1.手工ADO.NET事務:用SqlConnection.BeginTransaction 方法來啟動事務,返回關聯的SqlTransaction 對象。將事務對象關聯到參與事務的命令上,用SqlTtansaction.Commit 方法提交事務SqlTransaction.Rollback 方法來回滾事務。此過程與PB相同。
2.自動ADO.NET事務:自動事務是COM+ 提供的一個服務,如果要使用此服務,類需要遵從:
◆必須直接或間接從SystemEnterpriseServicedComponent派生。
◆將 TransactionAttribute 應用此類來控制類的事務行為。
◆使用強名稱為組件簽名。
◆將[AutoComplete] 特性(屬性信息)應用于類中的方法。如果含有[AutoComplete] 特性的方法調用完成而沒有錯誤,則事務被提交,否則被回滾。
測試過程記錄:
開始用時c#做自動事務測試實例,在使用強名為組件簽名時,編譯時出現“重復屬性[assembly: AssemblyKeyFile("f:\\complusexample1.snk")]”錯誤。用vb.net 做測試實例,一切正常。
仔細研究C# 發現工程中自己生成的文件:AssemblyInfo.cs中已經包含[assembly: AssemblyKeyFile("")]條目,把此條目改為:[assembly: AssemblyKeyFile("f:\\complusexample1.snk")],同時,去掉在ComPlusExample1 中的對應屬性信息。
- using System;
- using System.EnterpriseServices ;
- using System.Reflection ;
- ///[assembly: AssemblyKeyFile("f:\\complusexample1.snk")](此部件屬性信息要放到AssemblyInfo.cs文件中。)
- [assembly:ApplicationName("ComPlusExample1")]
- namespace ComPlusExample1
- {
- [Transaction(TransactionOption.Required )]
- public class ComPlusExample1 : ServicedComponent
- {
- public ComPlusExample1():base()
- {
- }
- {
- return "my god!";
- }
- }
- }