2

나는 (엔티티 프레임 워크 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(); 
} 

내가 오류를 얻을,하지만 데이터가 데이터베이스에 기록되지 않습니다. 그러나 로그 파일 대상 (테스트 목적으로 만 존재)은 정상적으로 작동합니다. 다음은 내 nLog (v2를 사용하고 있습니다) 설정입니다.

<?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> 

Logger 선을 트랜잭션 스코프 외부로 이동하면 정상적으로 작동합니다. 그래서 나는 이것이 그 일과 관련이 있다고 생각합니다. 내 메인 데이터베이스에 SQL Server 2008 r2를 사용하고 로깅 데이터베이스에 SQL Compact 4를 사용하고 있습니다. 또한 useTranscations = "true"를 추가하려고했습니다.

내가 잘못하고있는 아이디어가 있습니까?

감사

앨런

+0

트랜잭션 범위 외부에서 데이터베이스를 사용하는 경우 로거가 작동합니까? –

+0

안녕하세요, 그렇습니다. logscope 외부로 이동하면 로거가 작동합니다. –

답변

1

당신은 트랜잭션 스팬에게 distributed transaction 두 개의 서로 다른 서버를 가지고 노력하고 있습니다. 아쉽게도 SQLCE는 분산 트랜잭션 (documentation)을 지원하지 않습니다.

분산 트랜잭션은 SQL Server Compact에서 지원되지 않습니다. 따라서 로컬 트랜잭션은 완전히 분배 가능한 트랜잭션으로 자동 승격되지 않습니다.

SQL 2008 R2 데이터베이스에 로그온하지 않는 이유가 궁금하지만 SQLCE에 로그온해야한다면 트랜잭션이 커밋되었는지 여부를 추적하고 NLog를 호출할지 여부를 결정해야합니다. TransactionScope 블록이 완료된 후

+0

감사합니다 adrift, 나는 로깅을 위해 SQLCE를 사용하여 메인 데이터베이스에 로그 항목을 채우지 않습니다. 또한 데이터베이스 서버에 오류가 발생하면 SQLCE 데이터베이스에서이 항목에 대한 로그 항목을 얻을 것이라는 생각이 들었습니다. 텍스트 파일에 로깅하여이 사실을 알 수 있습니다. 즉, 메인 데이터베이스로 로깅을 이동하고 정기적으로 플러시 할 것입니다. –