我有一个情况,我在一个具有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