3

実稼働環境でローカルに取得できない問題が発生しています。

以下のように、TransactionScope 内で LINQ to SQL コードを実行しています。

        using (var scope = new TransactionScope())
        {
            uploadRepository.SubmitChanges();
            result = SubmitFileResult.Succeed();

            ScanForNewData(upload);

            scope.Complete();
        }

ScanForNewData() は GetSubmittedData() を呼び出します。GetSubmitted() で例外が発生した場合、Nlog を使用してエラーをファイル、データベースに書き込み、電子メールも送信します。

        catch (Exception ex)
        {
            //MT - having to comment this out beause it is causing a problem with transactions on theproduction server
            logger.ErrorException(String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName), ex);
            return new UploadGetSubmittedDataResult { Exception = ex, Success = false, Message = String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName) };
        }

次に ScanForNewData で、repository.SubmitChanges() を呼び出します。これにより、以下が発生します。

操作は、トランザクションの状態に対して無効です。System.Transactions.TransactionException TransactionException System.Transactions.TransactionException: トランザクションの状態に対して操作が有効ではありません。

私が思いついた最良のアイデアは、本番環境では、このコードが Web サーバー上で実行され、別のデータベース サーバーを呼び出すというものです。DataContext と Nlog の両方に同じ接続文字列構成と Sql ユーザーがありますが、サーバーがリモートであるために (ローカルで統合セキュリティを使用しているのに対して)、奇妙なことが起こっている可能性があります。

このシナリオでトランザクションに何が起こるか考えていますか?

更新 - ローカルの SQL ユーザーで試してみましたが、それでも問題なく動作します。制作環境に関係あるのでしょう...

別の更新 - 私は嘘をつきます。dev マッチングでは、Nlog データベース レコードは書き込まれず、電子メールが送信され、TransactionException は発生しません。

4

3 に答える 3

0

これを見てください..Nlogのバグのようです。

https://groups.google.com/forum/#!msg/nlog-users/I5UR-bISlTA/6RPtOZhR4NoJ

推奨される解決策は、Db ロギングに非同期ターゲットを使用することです。

于 2013-10-16T12:48:22.663 に答える
0

TransactionException の内部例外が何であるかを知らなければ、解決するのは難しいでしょうが、ここに考えがあります:

トランザクション スコープの周りの using ブロックが終了した後にログを記録するようにコードをリファクタリングすると、トランザクション スコープが終了し、DTC がトランザクションをロールバックするため、発生している問題を回避できる可能性があります。

トランザクションを処理するときに、過去にこのパターンを使用して見たことがあります (トランザクションが終了してロールバックされるまでログに記録しないでください)。

このような問題を回避するために、別のデータベースにログを記録することを常にお勧めします。これを行うと、問題も回避されます。

于 2012-06-06T05:16:09.657 に答える
0

例外の完全なスタック トレースがなければ、何が問題なのかを推測するのは困難です。複数の要因に依存している可能性があります。

たとえば、NLog が自分自身でデータベースへの新しい接続を開くと想定しています。これにより、おそらくトランザクションが分散トランザクションに昇格し、分散トランザクション コーディネーターが起動します。これにより、動作間に非対称性が生じる可能性があります。本番環境とローカルでのアプリケーションの。

未処理の例外や一部のデータへの不正なアクセスなど、トランザクション内の何らかの操作でトランザクションを中断している可能性があります。

完全なスタック トレースと、より深い分析に関連するより多くのコードを提供します。

于 2012-06-03T00:17:41.737 に答える