4

抛出异常的代码非常简单 - 这是非常常规的插入然后提交更改语句,它看起来:

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

所以真的没什么特别的。该语句每天执行大约 5 万次,没有任何问题,但是:每天大约执行 6 到 10 次,结果如下:

在调用 SubmitChanges 期间无法执行该操作。

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

我试图找出那可能是什么,但找不到线索这种行为非常不确定,礼貌地说 - 它如何正确完成 50k 次而几次不正确?

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 做同样的事情,但这个问题并没有发生......

所以我的好奇心让我思考为什么?

4

2 回答 2

5

这听起来像是一个线程问题,当另一个线程处于 SubmitChanges 的中间时,您正在调用 Log 并因此在一个线程上调用 SubmitChanges。

我怀疑你的 DataContext 仍然是一个全局静态变量。

尝试将您的 Log 方法更改为

using (var context = new DataContext(ConnectionString))
{
    context.tb_dayErrorLog.InsertOnSubmit(data);
    context.SubmitChanges();
}
于 2011-12-14T13:12:13.050 回答
0

@SgMoore 指出并发问题,在我的情况下确实如此。如果是这种情况,另一种方法是使用这样的锁:

 String lockValue = "";

  lock (lockValue)
  {
       context.tb_dayErrorLog.InsertOnSubmit(data);//UPDATE: concurrency error can  occur here too
       context.dc.SubmitChanges(); 
  }
于 2015-08-10T10:37:54.423 回答