Ошибка «Сервер не смог возобновить транзакцию» в SQL Server 2008 + .NET3.5 + LINQ - PullRequest
2 голосов
/ 09 октября 2010

Код 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;

            }
        }     

Метод бизнес-класса:

            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();

Иногда (очень часто я получаю эту ошибку (sqlserverexception) при выполнении этого кода: «Серверу не удалось возобновить транзакцию». Опять же, это просто случайный процесс, иногда он выполняется, а иногда - нет. продолжает терпеть неудачу в течение некоторого периода времени.

Я использовал хранимую процедуру для обновления таблицы вместо этого кода LINQ, и возникла та же проблема.

1 Ответ

5 голосов
/ 09 октября 2010

Вы можете обратиться по этой ссылке: серверу не удалось возобновить транзакцию . Сводка того, что я видел для этой ошибки, состоит в том, что несколько команд выполняются с одним соединением. Клиентский код затем запутывается в транзакции, которая остается в силе, когда в соответствии с SQL Server она была зафиксирована или откатана. Просматривая ваш код для метода бизнес-класса, я заметил, что контекст не в выражении использования. Класс контекста должен реализовывать 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();
            }

и посмотрите, не решит ли это вашу проблему.

...