以下代码打开一个独立于任何包含范围的新事务范围:
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
作用域在这种情况下基本上什么都不做。环境事务是空的,是的,但是你的连接之前已经开始了一个事务,所以你的代码在抑制块仍然会在这个相同的事务中运行(或者它会失败,例如实体框架会注意到这种情况并抛出一个异常)。