C# 事务作用域下对SQL Server的多个异步查询
尝试在事务作用域下对SQL Server运行多个异步查询-不幸失败。有没有办法让它起作用?在GitHub上 我有一个测试表:C# 事务作用域下对SQL Server的多个异步查询,c#,.net,sql-server,ado.net,C#,.net,Sql Server,Ado.net,尝试在事务作用域下对SQL Server运行多个异步查询-不幸失败。有没有办法让它起作用?在GitHub上 我有一个测试表: 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]) VALU
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
是:
const string CS = @"Data Source = .; Initial Catalog = Test; Integrated Security = True;";
const string Select = "WAITFOR DELAY '00:00:05'; " +
"SELECT [Name] FROM [People] WHERE [Id] = 1;";
async Task<string> QueryAsync()
{
using (var c2 = new SqlConnection(CS))
{
await c2.OpenAsync();
var cmd2 = c2.CreateCommand();
cmd2.CommandText = Select;
cmd2.CommandType = System.Data.CommandType.Text;
return await cmd2.ExecuteScalarAsync() as string;
}
}
const string CS=@“数据源=;初始目录=测试;集成安全性=真;”;
const string Select=“等待延迟'00:00:05'+
“从[People]中选择[Name],其中[Id]=1;”;
异步任务QueryAsync()
{
使用(var c2=新的SqlConnection(CS))
{
等待c2.OpenAsync();
var cmd2=c2.CreateCommand();
cmd2.CommandText=选择;
cmd2.CommandType=System.Data.CommandType.Text;
将wait cmd2.ExecuteScalarAsync()作为字符串返回;
}
}
问题发生在第二个连接打开时:
消息:测试方法SqlTests.UnitTest1.Should\u工作引发异常:
System.AggregateException:发生一个或多个错误。-->
System.Transactions.TransactionBortedException:该事务具有
中止。-->System.Transactions.TransactionPromotionException:
尝试升级事务时失败。-->
System.Data.SqlClient.SqlException:已存在打开的
必须先关闭与此命令关联的DataReader。
--->System.ComponentModel.Win32异常:等待操作超时
它在没有重叠查询的情况下工作吗?i、 类似于
varforeach(Enumerable.Range(0,2)中的vari)的东西等待QueryAsync()代码>?或者并发性是您在这里尝试做的一个关键部分?(注意:对单个服务器的并发查询通常不会提高性能)是的,它在异步时可以同步工作或逐个工作,但并行执行正是我在这里寻找的。