2

Iは次のようにトランザクションを使用する(Entity Frameworkの4.2を使用して)ASP.NET MVC 3アプリケーションを有する:nLogとのTransactionScope

using (var transaction = new TransactionScope()) 
{ 
    // Database action 1 

    // Database action 2 

    context.SaveChanges(); 

    Logger.Info("Record X updated"); 

    transaction.Complete(); 
} 

私はエラーを取得し、ないデータがデータベースに書き込まれていません。しかし、ログファイルのターゲット(テスト目的のためだけに)は正常に動作します。私はそれが正常に動作のTransactionScopeの外ロガーラインを移動する場合

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     throwExceptions="true" 
     internalLogToConsole="true" 
     internalLogToConsoleError="true" > 

    <targets> 
     <target name="logfile" xsi:type="File" fileName="${basedir}app_data\file.txt" /> 

    <target xsi:type="Database" name="database"> 
     <commandText>INSERT INTO [LogEntries] (TimeStamp, Message, Level, Logger) VALUES(GETDATE(), @msg, @level, @logger)</commandText> 
     <parameter name="@msg" layout="${message}" /> 
     <parameter name="@level" layout="${level}" /> 
     <parameter name="@logger" layout="${logger}" /> 
     <dbProvider>System.Data.SqlServerCe.4.0</dbProvider> 
     <connectionString>Data Source=${basedir}app_data\Logger.sdf</connectionString> 
    </target> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Trace" writeTo="logfile" /> 
     <logger name="*" minlevel="Trace" writeTo="database" /> 
    </rules> 
</nlog> 

:ここでは私のnLog(私はV2を使用しています)configです。だから私はそれがこれと関係していると思います。私はメインデータベースにSQL Server 2008 r2を、ロギングデータベースにSQL Compact 4を使用しています。また、useTranscations = "true"を追加しようとしました。

私が間違っていることは何ですか?

おかげ

アラン

+0

トランザクションスコープ外でデータベースを使用すると、データベースへのロガーは機能しますか? –

+0

こんにちは、私がトランザクションスコープの外側に移動すると、ロガーが動作します。 –

答えて

1

あなたは、トランザクション・スパンにdistributed transactionある2台の異なるサーバーを持つようにしようとしています。残念ながら、SQLCEは分散トランザクション(documentation)をサポートしません。

分散トランザクションはSQL Server Compactではサポートされていません。したがって、ローカルトランザクションは完全に配布可能なトランザクションに自動的に昇格されません。

なぜSQL 2008 R2データベースにログオンしないのですか?しかし、SQLCEにログする必要がある場合は、トランザクションがコミットされているかどうかを追跡し、NLog TransactionScopeブロックが完了した後。

+0

ありがとうございました。私はログにSQLCEを使用していますので、メインデータベースにログエントリを入力しないようにしています。また、私は、データベースサーバーが失敗した場合、SQLCEデータベースにこのためのログエントリを取得するという考えがありました。私はテキストファイルにもロギングすることでこれを得ることができることに気付きました。つまり、メインデータベースにログインして定期的にフラッシュすると思います。 –

関連する問題