Cod*_*ike 4 .net c# ado.net transactions transactionscope
我有一种情况,我在一个具有TransactionScopeRequired = true的WCF服务中运行,这意味着将始终存在环境事务.
但是,我需要在应用程序的生命周期内启动一个新的连接,这意味着我不能让它使用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
Run Code Online (Sandbox Code Playgroud)
实际上这个例子可以通过这样说来变得更简单:
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
}
Run Code Online (Sandbox Code Playgroud)
我不希望我的连接真正拿起TransactionScope.在实际代码中,还有很多事情要做,范围内的数据库操作,我只需要1,我需要在事务范围的生命周期内保持不变.
我想真实的情况值得一提.这里实际发生的是在WCF服务调用期间,我使用企业库缓存块将对象添加到缓存.此对象是一个数据表,但也保持与Oracle建立连续通知的开放连接.这使我能够在底层Oracle表更改时自动刷新缓存的数据集.
任何数量的WCF初始化线程都可以访问数据缓存项,所有这些线程都在自己的事务范围内运行.我想你可以把它想象成将一个OracleConnection对象放在缓存中.更好的文本/示例代码块将是:
//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
}
Run Code Online (Sandbox Code Playgroud)
重点是我的连接在多个线程和事务范围内具有很长的生命周期.
您是否尝试过允许您设置范围的TransactionScope构造函数之一?将范围设置为"Requires New"会为您的连接创建一个新事务以进行登记.将范围设置为"Suppress"会使您的连接不会在任何事务中登记.至少,这就是我如何阅读文档.我自己从未有过这种特殊需求.
using(var tx = new TransactionScope(TransactionScopeOption.RequiresNew))
{
conn = new OracleConnection("my connection string");
conn.Open();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |