LinQ DataContext - Операция не может быть выполнена во время вызова SubmitChanges. - PullRequest
3 голосов
/ 14 декабря 2011

Код, который генерирует исключение, чрезвычайно прост - это очень регулярная вставка, а затем отправка оператора изменений, который выглядит так:

context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();

Так что на самом деле ничего особенного.Этот оператор выполняется около 50 тысяч раз в день без каких-либо проблем, но: примерно 6-10 раз в день он заканчивается:

Операция не может быть выполнена во время вызова SubmitChanges.

StackTrace:    at System.Data.Linq.DataContext.CheckNotInSubmitChanges()
at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)

Я пытался выяснить, что это может быть, но не могу найти подсказку. Это поведение очень не детерминировано, вежливо говоря - как оно может закончить 50 000 раз правильно, а несколько раз нет?

DataContextсначала был инициализирован как статический, а затем повторно использован для всех вызовов, так что я подумал, может быть, в этом проблема.Затем я изменил его для инициализации при каждом вызове, но результаты очень похожи.Еще несколько исключений в день.

Любая идея?


некоторые дополнения: функция выглядит следующим образом:

public override bool Log(ErrorLogData logData)
    {

        try
        {
            logData.ProcessID = _processID;
            //Create new log dataset
            var data = new DataRecord
            {
                application = logData.Application,
                date = DateTime.Now,
                Other = logData.Other,
                process = logData.ProcessName,
                processid = logData.ProcessID,
                severity = logData.Severity,
                username = logData.UserName,
                Type = (short)logData.ErrorType
            };


            var context = new DataContext(ConnectionString);

            context.tb_dayErrorLog.InsertOnSubmit(data);
            context.SubmitChanges();

        }
        catch (Exception ex)
        {
            //log log in eventviewer
            LogEvent(logData.ToString(), ex);
            return false;
        }
        return true;
    }

настолько простая инициализация записи и затем вставка.

Как я писал в комментарии, при создании Ado.Net и SqlCommand одной и той же проблемы не возникает ...

Так что мое любопытство заставляет меня задуматься, почему?

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

Это звучит как проблема с потоками, когда вы вызываете Log и, следовательно, SubmitChanges в одном потоке, когда другой поток находится в середине SubmitChanges.

Я подозреваю, что ваш DataContext все еще является глобальной статической переменной.

Попробуйте изменить метод журнала на

using (var context = new DataContext(ConnectionString))
{
    context.tb_dayErrorLog.InsertOnSubmit(data);
    context.SubmitChanges();
}
0 голосов
/ 10 августа 2015

@ SgMoore указывает на проблему параллелизма, и в моем случае это действительно было.Если это так, другой подход заключается в использовании блокировки следующим образом:

 String lockValue = "";

  lock (lockValue)
  {
       context.tb_dayErrorLog.InsertOnSubmit(data);//UPDATE: concurrency error can  occur here too
       context.dc.SubmitChanges(); 
  }
...