nLog и TransactionScope - PullRequest
       29

nLog и TransactionScope

2 голосов
/ 14 ноября 2011

У меня есть приложение ASP.NET MVC 3 (с использованием Entity Framework 4.2), которое использует транзакции следующим образом:

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".

Есть идеи, что я делаю не так?

Спасибо

Alan

1 Ответ

1 голос
/ 15 ноября 2011

Вы пытаетесь использовать транзакцию на двух разных серверах, которая является распределенной транзакцией . К сожалению, SQLCE не поддерживает распределенные транзакции (из документации ):

Распределенные транзакции не поддерживаются в SQL Server Compact. Поэтому локальная транзакция не будет автоматически преобразована в полностью распространяемую транзакцию.

Мне любопытно, почему вы не входите в базу данных SQL 2008 R2, но если вам нужно войти в SQLCE, я думаю, вам придется отслеживать, зафиксирована ли транзакция, а затем определять, следует ли вызывать NLog после TransactionScope блок завершен.

...