例外をスローするコードは非常に簡単です。これは非常に通常の挿入であり、次のような変更ステートメントを送信します。
context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();
本当に特別なことは何もありません。このステートメントは、1 日に約 5 万回実行されても問題ありませんが、1 日に約 6 ~ 10 回は次のように終了します。
SubmitChanges の呼び出し中は操作を実行できません。
StackTrace: at System.Data.Linq.DataContext.CheckNotInSubmitChanges()
at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)
私はそれが何であるかを見つけようとしていましたが、手がかりを見つけることができません.この動作は非常に決定論的ではありません.
DataContext
最初に静的なものとして初期化され、次にすべての呼び出しで再利用されたので、それが問題かもしれないと考えていました。次に、すべての呼び出しで初期化されるように変更しましたが、結果は非常に似ています。1 日に数回の例外がまだあります。
何か案が?
いくつかの追加: 関数は次のようになります:
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で同じことをしている間、この問題は発生していません...
だから私の好奇心は私に理由を考えさせますか?