尝试在事务范围下对SQL Server运行多个异步查询 - 遗憾的是它失败了。有什么方法可以使它工作吗? Unit test在GitHub上。
我有一张测试表:
database
只有一条记录:
CREATE TABLE [dbo].[People]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
)
测试代码如下所示:
INSERT INTO [People] ([Name]) VALUES ('John Doe')
其中[TestMethod]
public void Should_Work()
{
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
var tx = Transaction.Current;
var name = Task.Run(async () =>
{
using (var scope2 = new TransactionScope(tx,
TransactionScopeAsyncFlowOption.Enabled))
{
var result = await Task.WhenAll(
from i in Enumerable.Range(0, 2)
select QueryAsync());
scope2.Complete();
return result[0];
}
}).Result;
Assert.AreEqual("John Doe", name);
}
}
是:
QueryAsync
问题出现在第二次连接开放时:
消息:测试方法SqlTests.UnitTest1.Should_Work引发异常: System.AggregateException:发生一个或多个错误。 ---> System.Transactions.TransactionAbortedException:事务有 中止。 ---> System.Transactions.TransactionPromotionException: 尝试促进交易时失败。 ---> System.Data.SqlClient.SqlException:已经打开了 与此命令关联的DataReader必须先关闭。 ---> System.ComponentModel.Win32Exception:等待操作超时