我有一個情況,我在一個具有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
}
點是我必須有跨越多個線程和交易範圍長壽命的連接。
不知何故,我錯過了構造函數參數,謝謝!有趣的是,使用.Suppress會導致我的應用程序永遠在調用OracleCommand.ExecuteReader()時掛起。可能是因爲TransactionScope塊在ExecuteReader調用之前結束了。 (給我的OP添加了一個註釋) – CodingWithSpike 2009-08-02 14:41:56