在 Web 服务中,我正在查询 SQL Server 2016 数据库。使用 .NET TransactionScope 如下在我的服务层中保留事务管理,但在我的数据层(“存储”类)代码中保留数据查询/命令,我们有几个地方遵循这种模式:
using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
bool needsInsert = await store1.Exists(request.id);
if (needsInsert) mainRowsUpdatedCount = await store2.Insert(request);
transaction.Complete();
}
这些“存储”方法中的每一个都遵循这种模式(使用 Dapper,尽管我怀疑这并不重要):
const string query = @"SELECT ..."; // or INSERT or MERGE as the case may be
using IDbConnection connection = new SqlConnection(ConnectionString.Value);
return await connection.QueryAsync<T>(query, new { ... }); // or connection.ExecuteAsync as the case may be
这在大多数呼叫中都非常有效,但有时我会得到以下信息(尽管很少见):
System.PlatformNotSupportedException:此平台不支持分布式事务。
那么,在上面的示例中,是否可能是 store1.Exists 运行,获取连接,将其加入事务,运行其查询,关闭,然后有时在 store2.Insert 可以运行之前,其他一些不相关的线程从由于 .NET Core(或 .NET 5+)不支持分布式事务,已打开事务的连接池尝试运行查询并因此引发 PlatformNotSupportedException?
如果是这样,我怎样才能在不传递我的联系的情况下克服这个问题?
如果不是,还有什么可能导致此异常?