SQL Server 2008 + .NET3.5 + LINQ中的"服务器无法恢复事务"错误

Vit*_*eis 2 c# linq asp.net .net-3.5 sql-server-2008

aspx.cs代码: 代码本身非常大,这里的代码是虚构的,但它看起来(重要的部分)是这样的:

foreach (Transaction trans in vTransactionList)
        {
            switch (trans)
            {
                case 201: codehere; break;
                case 202: codehere; break;
                case 203: 
                       vProcesso.MarcaEnvioServico(
                                    trans.ProcessId,
                                    trans.CodTrans);
                       break;

            }
        }     
Run Code Online (Sandbox Code Playgroud)

业务类方法:

            RENDataContext db = new RENDataContext();

            Processo update = tabela.SingleOrDefault(
                x => x.CodTrans == pCodTrans);

            update.SentDate= DateTime.Now;
            update.ProcessId = pProcessId;
            update.LogUsuario = pUsuario_Id;
            update.LogVersaoRegistro = servico.LogVersaoRegistro + 1;
            update.LogDataAlteracao = DateTime.Now;

            db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

有时(很频繁我执行此代码时出现此错误(sqlserverexception):"服务器无法恢复交易"再次,它只是随机的,有时执行有时它没有当它失败首先它不断失败的.一段时间.

我正在使用存储过程来更新表而不是LINQ代码,并且发生了同样的问题.

Ste*_*ger 5

您可能想查阅此链接: 服务器无法恢复事务.我在此错误中看到的内容摘要是使用单个连接执行多个命令.然后,根据已提交或回滚的SQL Server,客户端代码会对仍然有效的事务感到困惑.在查看业务类方法的代码时,我注意到上下文不在using语句中.上下文类应该实现IDisposable,因此在使用上下文时应该调用Dispose.您可以尝试将代码更改为:

            using(RENDataContext db = new RENDataContext()){

                Processo update = tabela.SingleOrDefault(
                    x => x.CodTrans == pCodTrans);

                update.SentDate= DateTime.Now;
                update.ProcessId = pProcessId;
                update.LogUsuario = pUsuario_Id;
                update.LogVersaoRegistro = servico.LogVersaoRegistro + 1;
                update.LogDataAlteracao = DateTime.Now;

                db.SubmitChanges();
            }
Run Code Online (Sandbox Code Playgroud)

并查看是否不能解决您的问题.