如何使TransactionScope在大型SQL事务上工作?

罗伯特·韦瑟曼

我有一个需要写入sql数据库表的应用程序。需要对sql字符串的IN语句中使用的ID进行分块,因为IN中可能存在300k ID,这会使Web配置中的最大字符串长度溢出。当我尝试使用200 + k ID而不是50K ID左右的场景测试场景时,出现此错误:

与当前连接关联的事务已完成,但尚未处理。必须先处理事务,然后才能使用该连接执行SQL语句。

这是代码:

    public int? MatchReconDetail(int ReconRuleNameID, List<int> participants, int? matchID, string userID, int FiscalPeriodID)
    {
                DataContext context = new DataContext();
        context.CommandTimeout = 600;



            using (TransactionScope transaction = new TransactionScope())
            {

                Match dbMatch = new Match() { AppUserIDMatchedBy = userID, FiscalPeriodID = FiscalPeriodID, DateCreated = DateTime.Now };
                context.Matches.InsertOnSubmit(dbMatch);
                context.SubmitChanges();

                //string ids = string.Concat(participants.Select(rid => string.Format("{0}, ", rid))).TrimEnd(new char[] { ' ', ',' });

                int listCount = participants.Count;
                int listChunk = listCount / 1000;
                int count = 0;
                int countLimit = 1000;


                    for (int x = 0; x <= listChunk; x++)
                    {

                        count = 1000 * x;
                        countLimit = 1000 * (x + 1);
                        List<string> chunkList = new List<string>();

                        for (int i = count; i < countLimit; i++)
                        {
                            if (listCount - count < 1000 && listCount - count != 0)
                            {
                                int remainder = listCount - count;

                                for (int r = 0; r < remainder; r++)
                                {
                                    chunkList.Add(participants[count].ToString());
                                    count++;
                                }

                            }
                            else if (listCount - count >= 1000)
                            {
                                chunkList.Add(participants[i].ToString());
                            }

                        }

                        string ids = string.Concat(chunkList.Select(rid => string.Format("{0}, ", rid))).TrimEnd(new char[] { ' ', ',' });

                        string sqlMatch = string.Format("UPDATE [Cars3]..[ReconDetail] SET [MatchID] = {0} WHERE [ID] IN ({1})", dbMatch.ID, ids);

                        context.ExecuteCommand(sqlMatch);

                    }

                matchID = dbMatch.ID;

                context.udpUpdateSummaryCache(FiscalPeriodID, ReconRuleNameID, false);

                transaction.Complete();
            }

            return matchID;
        }
    }

我已经阅读了一些有关超时问题的文章,因此在此函数的顶部添加了context.CommandTimeout。事件触发大约一分钟后,似乎发生了错误。

任何想法将不胜感激。

雅库布·洛兹(Jakub Lortz)

您还需要设置事务超时。不仅根据命令。

您可能还必须修改最大事务超时。默认值为10分钟,可以在machine.config文件中更改

阅读此博客文章以获取更多详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何 !!在bash上工作?

来自分类Dev

在进行大型合并以掌握之前,如何在长期功能分支上工作时不断解决冲突?

来自分类Dev

如何使Armadillo在Windows上工作?

来自分类Dev

如何在OSX上工作?

来自分类Dev

嵌套事务的正确TransactionScope

来自分类Dev

嵌套事务的正确TransactionScope

来自分类Dev

像“ TransactionScope”这样的代码如何工作?

来自分类Dev

事务提交后如何工作

来自分类Dev

使%在SQL块中的“开始”或“结束”上工作

来自分类Dev

如何从查询中删除MS SQL TOP子句以使其在SQLite上工作

来自分类Dev

如何从查询中删除MS SQL TOP子句以使其在SQLite上工作

来自分类Dev

exec如何在Linux上工作

来自分类Dev

如何让“自我”在课堂上工作

来自分类Dev

orElse如何在PartialFunctions上工作

来自分类Dev

如何让Bamboo Pad在Ubuntu 14.04上工作

来自分类Dev

如何让htaccess在每个页面上工作

来自分类Dev

如何分配进程以在部分CPU上工作?

来自分类Dev

文件权限如何在OpenShift上工作?

来自分类Dev

如何让梨在Azure网站上工作?

来自分类Dev

如何使BundleTransformer在Windows Server Core上工作

来自分类Dev

如何使pip3在Linux上工作

来自分类Dev

如何启动Firebase Analytics在Web上工作?

来自分类Dev

如何使Vue Sortable在桌子上工作?

来自分类Dev

造型如何在角组件上工作?

来自分类Dev

如何使内部联接在TypeORM上工作?

来自分类Dev

如何使Rust草书的示例在Windows上工作?

来自分类Dev

如何分配进程以在部分CPU上工作?

来自分类Dev

如何使Flash内容在移动设备上工作?

来自分类Dev

如何使ffmpeg-normalize在Ubuntu上工作?

Related 相关文章

热门标签

归档