4

例外をスローするコードは非常に簡単です。これは非常に通常の挿入であり、次のような変更ステートメントを送信します。

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で同じことをしている間、この問題は発生していません...

だから私の好奇心は私に理由を考えさせますか?

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 に答える