抛出异常的代码非常简单 - 这是非常规则的插入,然后提交看起来更改的语句:
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做同样的事情时没有出现这个问题......
所以我的好奇心让我想到了为什么?
答案 0 :(得分:5)
这听起来像一个线程问题,当另一个线程在SubmitChanges的中间时,你在一个线程上调用Log并因此调用SubmitChanges。
我怀疑你的DataContext仍然是一个全局静态变量。
尝试将Log方法更改为
using (var context = new DataContext(ConnectionString))
{
context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();
}
答案 1 :(得分:0)
@SgMoore指向并发问题,在我的情况下确实如此。如果是这种情况,另一种方法是使用这样的锁:
String lockValue = "";
lock (lockValue)
{
context.tb_dayErrorLog.InsertOnSubmit(data);//UPDATE: concurrency error can occur here too
context.dc.SubmitChanges();
}