【问题标题】:nLog and TransactionScopenLog 和 TransactionScope
【发布时间】:2011-11-14 10:50:22
【问题描述】:

我有一个 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"。

任何想法我做错了什么?

谢谢

艾伦

【问题讨论】:

  • 在事务范围之外使用时,您的数据库记录器是否工作?
  • 嗨赫克托,是的,如果我将记录器移到事务范围之外,记录器就会工作。

标签: asp.net-mvc-3 entity-framework-4 transactions transactionscope nlog


【解决方案1】:

您正试图让事务跨越两个不同的服务器,即distributed transaction。不幸的是,SQLCE 不支持分布式事务(来自documentation):

SQL Server Compact 不支持分布式事务。因此,本地事务不会自动提升为完全可分发的事务。

我很好奇你为什么不登录到 SQL 2008 R2 数据库,但是如果你必须登录到 SQLCE,我想你必须跟踪事务是否已提交,然后确定是否在执行后调用 NLog TransactionScope 块完成。

【讨论】:

  • 感谢 adrift,我正在使用 SQLCE 进行日志记录,这样我就不会用日志条目填充主数据库。另外,我的想法是,如果数据库服务器发生故障,我会在 SQLCE 数据库中获得一个日志条目。我意识到我也可以通过登录到文本文件来获得它。也就是说,我认为我会将日志记录移至主数据库并定期刷新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多