【问题标题】:Why isn't my transaction escalating to DTC?为什么我的交易没有升级到 DTC?
【发布时间】:2011-08-20 08:25:15
【问题描述】:

DTC 在我的机器上被禁用。我的理解是这段代码应该失败,因为它在同一个事务中使用了两个数据上下文。那么,为什么它会起作用? (注意:我使用 .NET 3.5 和 .NET 4.0 进行了尝试。)

using (TransactionScope transactionScope = new TransactionScope())
{
    UpdateEta();
    UpdateBin();

    transactionScope.Complete();
}

以下是被调用的 DAL 方法:

public static void UpdateBin(Bin updatedBin)
{
    using (DevProdDataDataContext dataContext = new DevProdDataDataContext(ConnectionString))
    {
        BinRecord binRecord = (from bin in dataContext.BinRecords
                               where bin.BinID == updatedBin.BinId
                               select bin).FirstOrDefault();

        binRecord.BinID   = updatedBin.BinId;
        binRecord.BinName = updatedBin.BinName;

        dataContext.SubmitChanges();
    }
}  

public static void UpdateEta(Eta updatedEta)
{
    using (DevProdDataDataContext dataContext = new DevProdDataDataContext(ConnectionString))
    {
        EtaRecord etaRecord = (from eta in dataContext.EtaRecords
                               where eta.ID == updatedEta.ID
                               select eta).FirstOrDefault();

        etaRecord.ID    = updatedEta.ID;
        etaRecord.Title = updatedEta.Title;

        dataContext.SubmitChanges();
    }
}

【问题讨论】:

  • 霍恩先生问得好。

标签: c# linq-to-sql datacontext


【解决方案1】:

两者之间的连接字符串是否不同?如果不是,可能是它们都重用了同一个底层连接池中的同一个连接,从而消除了升级到 DTC 的需要?

【讨论】:

  • 如果字符串相同,SQL 2008 重新使用连接。我不相信 2005 年会促进交易......
  • 我想就是这样,伙计们。我确实在使用相同的连接字符串,而且我确实在使用 SQL Server 2008。但是,我不能依赖这种行为,因为如果底层连接变得不可用(来自连接池),那么也许我们会有DTC 问题。谢谢!
【解决方案2】:

我不相信您在帖子中使用了两个不同的上下文。
此外,我的理解是,如果数据库连接到同一台机器上的同一个数据库,那么就没有必要升级到 DTC。当事务中使用两个不同的数据库服务器时,就会发生这种升级。

【讨论】:

    【解决方案3】:

    您的数据库连接不是嵌套的。它们是按顺序使用的。将一个过程粘在另一个过程中,然后重试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2015-03-29
      相关资源
      最近更新 更多