Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# 为什么给定代码会生成';数据库的请求限制为X';使用Azure SQL_C#_Azure Sql Database_Dapper - Fatal编程技术网

C# 为什么给定代码会生成';数据库的请求限制为X';使用Azure SQL

C# 为什么给定代码会生成';数据库的请求限制为X';使用Azure SQL,c#,azure-sql-database,dapper,C#,Azure Sql Database,Dapper,所以我有在Azure Functons消费计划中运行的代码。我的数据库被限制为60个并发登录或生成此错误的内容: The request limit for the database is X 我的问题是,为什么事务中的这个循环会达到这个限制?一个交易就是一个请求?还是不?我知道代码质量很差,但这只是因为我在搜索过程中使用了硬核解决方案 SOME_QUERY1 = "INSERT INTO SomeTable (p1,p2,p3,p4) Values (p1,p2,p3,p4); SELECT

所以我有在Azure Functons消费计划中运行的代码。我的数据库被限制为60个并发登录或生成此错误的内容:

The request limit for the database is X
我的问题是,为什么事务中的这个循环会达到这个限制?一个交易就是一个请求?还是不?我知道代码质量很差,但这只是因为我在搜索过程中使用了硬核解决方案

SOME_QUERY1 = "INSERT INTO SomeTable (p1,p2,p3,p4) Values (p1,p2,p3,p4); SELECT CAST(SCOPE_IDENTITY() as int)";
SOME_QUERY2 = "INSERT INTO OtherTable (10 fields)"; 

public async Task<IEnumerable<string>> SaveBusinessTransaction(TransactionBatchEntity businessEntity)
{
    using (var connection = new SqlConnection(_connectionString))
    {
        connection.Open();
        var successfullyAddedTransactions = new List<string>();

        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                var transactionId = (await connection.QueryAsync<int>(SOME_QUERY1, new { Paramter = 1 }, transaction)).Single();

                foreach (var details in businessEntity.Details)
                {
                    var detailsEntity = new
                    {
                        //some fields
                    };

                    await connection.ExecuteAsync(SOME_QUERY2, detailsEntity, transaction);
                    successfullyAddedTransactions.Add(detailsEntity.TransactionNumber);
                }

                transaction.Commit();

                return successfullyAddedTransactions;
            }
            catch (Exception)
            {
                transaction.Rollback();
                connection.Close();
                throw;
            }
        }
    }
}
检查,它可以帮助你。这是最近的,是他们这边的一个错误

“看起来后端出现了一个问题,HADR传输服务在大约两个小时内没有启动。 显然,SQL服务已重新启动,HADR传输服务未按预期启动。”

或者

“Sql server有时使用多个工作线程来执行查询,因此连接数并不总是与执行线程数相对应。”

“由于Azure SQL不支持全局设置此参数,我们的解决方案是将选项(MAXDOP 1)添加到有问题的查询中,以使其执行更加可预测(以并行性和速度为代价)。”


经过挖掘,我找到了原因,遗憾的是一级以上

transactions.ForEach(t => _sqlService.SaveBusinessTransaction(t));
正如我们所看到的,这是一个暂时的解决方案

transactions.ForEach(t => await _sqlService.SaveBusinessTransaction(t));

长期的解决方案是更改DB模式,但这不是这个答案的主题

sp_谁展示了有用的东西?是什么让你认为这是由于循环?这可能是因为函数“一次”运行超过60次(即由不同的调用者执行)?@mjwills它一次运行不超过一次,而“catch(Exception)”正在捕获此异常,而只有循环在运行。@Alex K.sp_没有显示有用的内容。谢谢。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-更新@Daz。感谢您的反馈!
transactions.ForEach(t => await _sqlService.SaveBusinessTransaction(t));