我正在使用LINQ to SQL和支持分布式事务的第三方SDK。当我意识到挂起的更新将更新第三方SDK中的SQL记录和记录时,我正在创建一个具有0(可能是无限的)超时的TransactionScope(尽管我还尝试了12小时作为时间跨度参数)。然后我在环境事务(由transactionscope创建)上使用GetDtcTransaction来获取DTC事务以链接到第三方SDK。事情很好地工作了大约10分钟,但在10分钟后,事务消失并发生错误。如何确定交易消失的原因。我怀疑这是暂停,因为它经常在10分钟后发生,即使在那时已经完成了稍微不同程度的工作。但我对如何确定终止交易的原因,原因以及如何延长其生命感到茫然。
我尝试使用SQL事件探查器跟踪以下事件:
我在错误发生时所能解决的是这些事件:
<Event id="19" name="DTCTransaction">
<Column id="3" name="DatabaseID">1</Column>
<Column id="11" name="LoginName">sa</Column>
<Column id="35" name="DatabaseName">master</Column>
<Column id="51" name="EventSequence">167065</Column>
<Column id="12" name="SPID">10</Column>
<Column id="60" name="IsSystem">1</Column>
<Column id="1" name="TextData">{D662BBC4-21EC-436D-991C-DCB061A34782}</Column>
<Column id="21" name="EventSubClass">16</Column>
<Column id="25" name="IntegerData">0</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="2" name="BinaryData">C4BB62D6EC216D43991CDCB061A34782</Column>
<Column id="14" name="StartTime">2009-11-11T13:55:32.82-06:00</Column>
<Column id="26" name="ServerName">.</Column>
<Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
<Column id="3" name="DatabaseID">9</Column>
<Column id="11" name="LoginName">sa</Column>
<Column id="31" name="Error">1222</Column>
<Column id="35" name="DatabaseName">ACS</Column>
<Column id="51" name="EventSequence">167066</Column>
<Column id="12" name="SPID">19</Column>
<Column id="20" name="Severity">16</Column>
<Column id="60" name="IsSystem">1</Column>
<Column id="1" name="TextData">Error: 1222, Severity: 16, State: 18</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="14" name="StartTime">2009-11-11T13:55:34.717-06:00</Column>
<Column id="26" name="ServerName">.</Column>
<Column id="30" name="State">18</Column>
<Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
<Column id="31" name="Error">8525</Column>
<Column id="8" name="HostName">MARTY755</Column>
<Column id="12" name="SPID">55</Column>
<Column id="20" name="Severity">16</Column>
<Column id="64" name="SessionLoginName">fse</Column>
<Column id="1" name="TextData">Error: 8525, Severity: 16, State: 1</Column>
<Column id="9" name="ClientProcessID">2516</Column>
<Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
<Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
<Column id="26" name="ServerName">.</Column>
<Column id="30" name="State">1</Column>
<Column id="50" name="XactSequence">236223201284</Column>
<Column id="3" name="DatabaseID">9</Column>
<Column id="11" name="LoginName">fse</Column>
<Column id="35" name="DatabaseName">ACS</Column>
<Column id="51" name="EventSequence">167067</Column>
</Event>
<Event id="162" name="User Error Message">
<Column id="31" name="Error">8525</Column>
<Column id="8" name="HostName">MARTY755</Column>
<Column id="12" name="SPID">55</Column>
<Column id="20" name="Severity">16</Column>
<Column id="64" name="SessionLoginName">fse</Column>
<Column id="1" name="TextData">Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction.</Column>
<Column id="9" name="ClientProcessID">2516</Column>
<Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
<Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
<Column id="26" name="ServerName">.</Column>
<Column id="30" name="State">1</Column>
<Column id="50" name="XactSequence">236223201284</Column>
<Column id="3" name="DatabaseID">9</Column>
<Column id="11" name="LoginName">fse</Column>
<Column id="35" name="DatabaseName">ACS</Column>
<Column id="51" name="EventSequence">167068</Column>
</Event>
DTCTransaction事件中的EventSubClass 16表示“交易正在中止”。
答案 0 :(得分:8)
要延长超时(未指定时默认为10分钟),需要在目标系统上更新C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ Machine.config(在C下查看) :\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG如果您正在运行64位)。将其添加为根级别下的最后一项:
<system.transactions>
<machineSettings maxTimeout="23:00:00"/>
</system.transactions>
这将(例如)将超时设置为23小时。
有效值在System.Transactions.TransactionManager.MaximumTimeout
中可见答案 1 :(得分:2)
可能是SqlConnection超时而不是分布式事务吗?
您可以使用SQL Server Profiler尝试监控意外的连接丢弃。您只需要确保为跟踪配置文件添加水,以便仅包含您需要监视的事件,因为它的输出可能非常详细。我首先只监视可以在“安全审计”事件类别下找到的“审计登录”和“审计注销”事件。
如果您正在分析除独立/仅用于自己的SQL Server实例以外的任何内容,您可能希望应用过滤器,以便只有来自主机的事件才会显示在输出中。 / p>
您可能希望明确specify a timeout value in your connection string - 将其设置得非常低,看看您是否能够更快地获得相同的行为。
从跟踪日志中,我看到两个例外,其详细信息如下:
1222例外的Google搜索显示http://www.sqlservercentral.com/Forums/Topic579864-146-1.aspx#bm645422,其中声明:
该错误意味着锁定 在msdb中请求并超时。 通常,这意味着它是一个 大临时表上的大交易或 大类,或类似的东西。
你有什么特别的吗? 长期运行的查询可能是 与之相关?也许是沉重的 职务报告,或类似的东西 是什么?
希望这会让你更远一点。
答案 2 :(得分:2)
对于除了我以外的所有人来说,这可能是显而易见的,但我只是坚持这个问题而想提及我是如何修复它的。即使我在BlueMonkMN指示的位置修改了文件,我仍然收到10分钟的默认事务超时。由于我运行的是Windows 7 64位,因此.NET的machine.config文件位置位于以下位置:
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG
请注意,“Framework64”文件夹与上述不同。