请帮我解决这个问题:
存在环境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。
答案 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)。