2009-07-31 60 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

相关问题