使用Linq2Sql DataContext.SubmitChanges()时,事务超时已到期

时间:2009-04-13 10:14:47

标签: wcf linq-to-sql transactions

请帮我解决这个问题:

存在环境MSMQ事务。我正在尝试使用新事务进行日志记录,但在尝试提交更改时会出现下一个错误 - “超时已过期。在操作完成之前已经过了超时时间,或者服务器没有响应。”这是代码:

public static void SaveTransaction(InfoToLog info)
    {
        using (TransactionScope scope =
            new TransactionScope(TransactionScopeOption.RequiresNew))
        {
            using (TransactionLogDataContext transactionDC =
                        new TransactionLogDataContext())
            {
                transactionDC.MyInfo.InsertOnSubmit(info);

                transactionDC.SubmitChanges();
            }

            scope.Complete();
        }
    }

请帮帮我。 THX。

2 个答案:

答案 0 :(得分:1)

你可以考虑增加超时或一起消除它。

类似的东西:

using(TransactionLogDataContext transactionDC = new TransactionLogDataContext())
{
    transactionDC.CommandTimeout = 0;  // No timeout.
}

小心

答案 1 :(得分:1)

你说:

  谢谢你。但是这个解决方案提出了一个新的问题 - 如果交易范围发生了变化,为什么提交操数据库和应用程序在同一台机器上

那是因为你正在那里创建新的DataContext:

TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 

使用新的数据上下文ADO.NET打开新连接(即使连接字符串相同,除非你做一些聪明的连接池)。 在尝试使用多个连接实例(您刚才这样做)时的事务上下文中 ADO.NET自动将事务提升为分布式事务,并尝试将其登记到MSDTC中。将每个连接的第一个事务处理到MSDTC需要花费时间(对我来说需要30多秒),连续的事务将会很快(但在我的情况下为60ms)。看一下这个http://support.microsoft.com/Default.aspx?id=922430

您可以做的是在创建新的DataContext时重用事务和连接字符串(如果可能)。

 TransactionLogDataContext tempDataContext = 
      new TransactionLogDataContext(ExistingDataContext.Transaction.Connection);
 tempDataContext.Transaction = ExistingDataContext.Transaction;

其中ExistingDataContext是启动环境事务的那个。

或尝试加速您的MS DTC。

另外,请使用billb建议的SQL Profiler,并在不同命令之间查找SessionId(在您的情况下保存和savelog)。如果SessionId发生变化,您实际上使用了2个不同的连接,在这种情况下,必须重用事务(如果您不希望将其提升为MS DTC)。

相关问题