Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事务作用域下对SQL Server的多个异步查询_C#_.net_Sql Server_Ado.net - Fatal编程技术网

C# 事务作用域下对SQL Server的多个异步查询

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

尝试在事务作用域下对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]) 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()?或者并发性是您在这里尝试做的一个关键部分?(注意:对单个服务器的并发查询通常不会提高性能)是的,它在异步时可以同步工作或逐个工作,但并行执行正是我在这里寻找的。