実稼働環境でローカルに取得できない問題が発生しています。
以下のように、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 は発生しません。