MSDTC推广的原因

时间:2015-07-09 20:31:51

标签: sql .net sql-server transactions msdtc

Reason for System.Transactions.TransactionInDoubtException提到交易被提升为MSDTC的三个原因。前两个是众所周知的,但第三个原因如下:

  

3.如果你有"尝试/捕捉{重试超时/死锁}"在代码中运行的逻辑,当事务在System.Transactions.TransactionScope中时,这会导致问题,因为SQL Server在发生超时或死锁时会自动回滚事务。

我在我的一个服务器应用程序中遇到严重负载时会看到此行为(SQL 2012)。我已经广泛尝试过谷歌搜索,但我没有找到更多信息。有没有人提到有关这个主题的其他信息?

感谢,

拉​​里

1 个答案:

答案 0 :(得分:0)

  

我想我们真的在一个连接上运行一个事务,引用计数为2。我同意的是假的,应该重新编码。

这本身不是问题。

  

但是,有时内部事务回滚并重试

问题是回滚会回滚所有内容。你不能孤立地重试“内在”的工作。 (是的,这将非常有用,但SQL Server不支持它。)

  

这样可以启动内部事务的第二个连接。这将导致调用MSDTC以尝试协调。

这没有实际意义,因为此时“外部”工作已被破坏。

这个问题没有很好的解决方案。最佳策略可能只有一个事务,并将外部内部工作重试为一个单元。重试始终必须重试整个事务。如果需要,可以使用事务“ref counting”,但不能使用它进行回滚。

SQL Server的一个特别令人讨厌的功能是,任何特定错误是否导致事务回滚都是不可预测的。因此,它是永远不会处理SQL Server错误并且始终声明事务丢失的最简洁方法。 (没有技术原因SQL Server必须这样做。这只是一个愚蠢的设计选择。)