首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务范围和Task.When全部执行

问事务范围和Task.When全部执行
EN

Stack Overflow用户
提问于 2022-03-17 08:02:15
回答 1查看 361关注 0票数 1

意图:使用事务提交/回滚支持加快support操作

  • 拥有相当大的数据(大约900 k的实体)
  • 希望将数据并行放置到SQL表中,将每个连接拆分数据(例如,3个活动连接,即每个连接300 k)。
  • 如果出了问题,希望有可能回滚,所以尝试使用事务范围(nested-TransactionScopeOption.Required)

发行:

看起来事务范围不能支持这样的Task.WhenAll,因此,如果在执行过程中出现错误,中间写就不会回滚。

Q:,所以我想知道它是可以工作的,还是利用事务范围的不合适的方式?

代码语言:javascript
复制
   public void Upsert(IEnumerable<IEnumerable<Item>> splitPerConnection, DateTime endDate)
    {
        using (var scope = _transactionScopeFactory.Create(TransactionScopeOption.Required))
        {
            try
            {
                UpdateEndDate(endDate);

                var insertTasks = splitPerConnection.Select(ch => Task.Run(() => Insert(ch)));

                Task.WhenAll(insertTasks).GetAwaiter().GetResult();

                scope.Complete();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

    private int Insert(IEnumerable<Item> items)
    {
        int affectedRows;

        using (var scope = _transactionScopeFactory.Create(TransactionScopeOption.Required))
        using (var sqlConnection = new SqlConnection(DockerMsSqlServerConnectionString))
        {
            sqlConnection.Open();
            affectedRows = sqlConnection.Execute(ItemsQueries.Insert, items, commandTimeout: 0);

            scope.Complete();
        }

        return affectedRows;
    }

    private int UpdateEndDate(DateTime endDate)
    {
        int affectedRows;

        using (var scope = _transactionScopeFactory.Create(TransactionScopeOption.Required))
        using (var sqlConnection = new SqlConnection(DockerMsSqlServerConnectionString))
        {
            sqlConnection.Open();
            affectedRows = sqlConnection.Execute(ItemsQueries.UpdateEndDate, new { EndDate = endDate }, commandTimeout: 0);

            scope.Complete();
        }

        return affectedRows;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-17 09:40:06

您可以尝试利用SqlBulkCopy,而不是将项拆分到不同的连接对象上。

快速将200万行插入Server

您可以通过修改IEnumerable<Item>创建数据集。所有的并行操作都可以在这里应用到从IEnumerable<Item>到dataset的转换。一旦创建了dataset,SqlBulkCopy将帮助您。您可以创建3-4组数据集,并执行3-4次插入查询。

在这种方法中,您可以维护一个数据库连接,它也有助于跟踪数据库事务的ACID遵从性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71508836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档