2009-07-31 55 views
4

我有一個情況,我在一個具有TransactionScopeRequired = true的WCF服務中運行,這意味着總會有一個環境事務。有沒有辦法創建一個ADO.NET連接並忽略環境事務?

但是,我需要啓動一個新的連接,該連接將在應用程序的整個生命週期中執行,這意味着我不能使用abmbient事務。

有關如何做到這一點的任何想法?說這個

Assert.IsNotNull(System.Transactions.Transaction.Current); 
var conn = new OracleConnection("my connection string"); 
conn.Open(); // <-- picks up ambient transaction, but I don't want that 

實際上,例如可以進行簡單:只是這樣做會自動使用環境事務

OracleConnection conn; // <-- this is actually held around in another object that has a very long lifetime, well past the TransactionScope. 
using(var tx = new TransactionScope()) 
{ 
    conn = new OracleConnection("my connection string"); 
    conn.Open(); // <-- picks up ambient transaction, but I don't want that 
    // ... do stuff 
} 

我不希望我的連接實際上拿起TransactionScope的。在實際的代碼中,還有很多事情要做,在範圍內執行數據庫操作,我只需要在事務範圍的整個生命週期內保留1。


我想現實情況值得一提。實際發生的情況是,在WCF服務調用期間,我使用企業庫緩存塊將對象添加到緩存。該對象是一個數據表,但也可以保持與已設置連續通知的Oracle的打開連接。這使我能夠在Oracle底層表更改時自動刷新我的緩存數據集。

數據緩存項可以被任意數量的WCF初始化線程訪問,所有線程都在其自己的事務範圍內運行。我想你可以把它看作將OracleConnection對象放入緩存中。的文/ exampe代碼更好的塊是這樣的:

//beginning of a WCF service call 
using (var tx = new TransactionScope()) 
{ 
    var conn = new OracleConnection(); 
    var cmd = new OracleCommand(); 
    // set up OCN on the cmd and connection 
    var reader = cmd.ExecuteReader(); 
    cache.Add("conn", conn); 
    cache.Add("cmd", cmd); 
} 

//beginning of a second wcf service call 
using (var tx = new TransactionScope()) 
{ 
    var conn = cache.Get("conn"); 
    var cmd = cache.Get("cmd"); 
    var reader = cmd.ExecuteReader(); 
    // user reader to reload some data 
} 

點是我必須有跨越多個線程和交易範圍長壽命的連接。

回答

5

您是否嘗試過一種允許您設置範圍的TransactionScope構造函數?將範圍設置爲「需要新的」會爲您的連接創建一個新的事務以便登錄。將範圍設置爲「取消」使得您的連接不會在任何事務中登記。至少,這是我如何閱讀文檔。我自己從未有過這種特殊需求。

using(var tx = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    conn = new OracleConnection("my connection string"); 
    conn.Open(); 
} 
+0

不知何故,我錯過了構造函數參數,謝謝!有趣的是,使用.Suppress會導致我的應用程序永遠在調用OracleCommand.ExecuteReader()時掛起。可能是因爲TransactionScope塊在ExecuteReader調用之前結束了。 (給我的OP添加了一個註釋) – CodingWithSpike 2009-08-02 14:41:56

相關問題