如何创建一个独立于任何包含作用域的作用域,并且不启动新事务?



以下代码打开一个独立于任何包含范围的新事务范围:

using (TransactionScope scope = new(TransactionScopeOption.Suppress, asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled))
{
var connection = _connectionFactory.GetConnection()
await connection.QueryAsync(...); // e.g. call DB with Dapper 
await connection.QueryAsync(...); // e.g. another call 
}

(使用的)

我如何使一个作用域独立于任何包含作用域启动一个新的事务?本质上,我想要"抑制"选项,但在"非事务"范围内。

您可以在不传递DependentTransaction的情况下运行线程。它是独立的。创建一个运行查询的函数,并使用如下:

using System.Threading.Tasks;
// ...
var task = new Task(FunctionWithQueries);
task.RunSynchronously();

Transaction.Current在具有Suppress选项的TransactionScope中为空,因此由于作用域,连接无法启动新事务-它甚至无法发现作用域存在。如果它启动了一个新的事务,那一定是另一个原因。

注意,上面我假设您在抑制事务范围内打开新连接,因为您使用:

var connection = _connectionFactory.GetConnection()

如果你不打开新的连接-那么Suppress作用域在这种情况下基本上什么都不做。环境事务是空的,是的,但是你的连接之前已经开始了一个事务,所以你的代码在抑制块仍然会在这个相同的事务中运行(或者它会失败,例如实体框架会注意到这种情况并抛出一个异常)。

相关内容

  • 没有找到相关文章

最新更新