当前位置: 首页 > 面试题库 >

System.Transactions.TransactionInDoubtException的原因

晏沈义
2023-03-14
问题内容

我有2个作业,这些作业在Sql
Server数据库中读取并产生数据。作业偶尔会因System.Transactions.TransactionInDoubtException而崩溃。确切的堆栈跟踪为:

 Unhandled Exception: System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception: The wait operation timed out. Exitcode: -532462766
    --- End of inner exception stack trace ---
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
    at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
    at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
    at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
    at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)

我在Google上搜索了一下,找到了有关MSDTC的信息,但是我认为这不是问题,因为事务应该是本地的,因为作业只能在单个数据库上工作。以下查询:

SELECT cntr_value AS NumOfDeadLocks
  FROM sys.dm_os_performance_counters
 WHERE object_name = 'SQLServer:Locks'
   AND counter_name = 'Number of Deadlocks/sec'
   AND instance_name = '_Total'

显示数据库上没有死锁,因此死锁不可能是原因。我在互联网上找不到任何其他资源可以提供有关异常原因的确切信息。那么,有人知道原因可能是什么,或者如何找到此错误的根源?


问题答案:

即使您是本地事务,根据本文,如果您在同一事务范围内打开多个连接,事务仍将升级为MSDTC:http : //msdn.microsoft.com/zh-
cn/library/ms229978(v= vs.110).aspx

在以下情况下发生升级,导致System.Transactions基础结构将事务的所有权转移到MSDTC:

* 事务中至少有两个支持单阶段通知的持久资源。例如,加入的单个连接不会导致事务升级。但是,每当您打开与数据库的第二个连接而导致该数据库加入时,System.Transactions基础结构都会检测到它是事务中的第二个持久资源,并将其升级为MSDTC事务。

注意:我已经阅读了一些文章,指出这仅适用于SQL 2005,并且SQL 2008+对于MSDTC升级更为精明。这些说明SQL 2008仅 在同时
打开多个连接时才会升级为MSDTC

另外,您的内部异常是Timeout(System.Data.SqlClient.SqlException:超时已过期),而不是Deadlock。虽然两者都与阻止有关,但它们不是同一件事。timeout当阻止导致应用程序停止等待被另一个连接阻止的资源时发生A
,以便当前语句可以获取对该资源的锁定。一deadlock,当两个不同的连接都用相同的资源竞争他们的方式阻止他们将永远无法完成,除非其中一个连接被终止时,以及(这是为什么僵局错误信息说:“交易......已经选择作为僵局的受害者”)。由于您的错误是超时,因此这说明了死锁查询返回0计数的原因。

System.Transactions.TransactionInDoubtException来自MSDN(http://msdn.microsoft.com/zh-
cn/library/system.transactions.transactionindoubtexception (
v=vs.110 )
.aspx)指出:

当尝试对有疑问的事务html" target="_blank">执行操作时,将引发此异常。当无法确定交易状态时,便会怀疑交易。特别是,对于该事务,永远不会知道事务的最终结果(无论是提交还是中止)。

当尝试提交事务并将事务变为InDoubt时,也会引发此异常。

原因:在期间发生了一些事情TransactionScope,导致交易结束时状态未知。

原因:可能有许多不同的原因,但是在不发布源代码的情况下很难确定您的具体原因。

检查事项:

  1. 如果您使用的是SQL 2005,并且打开了多个连接,则您的事务将被提升为MSDTC事务。
  2. 如果您使用的是SQL 2008+,并且同时打开了多个连接(即,嵌套连接或并行运行的多个ASYNC连接),则该事务将被提升为MSDTC事务。
  3. 如果您的代码中正在运行“ try / catch {retry if timeout / deadlock}”逻辑,则当事务在内时,这可能会引起问题System.Transactions.TransactionScope,因为SQL Server在超时或超时时会自动回滚事务的方式发生死锁。


 类似资料:
  • "prototype" 属性在 JavaScript 自身的核心部分中被广泛地应用。所有的内置构造函数都用到了它。 首先,我们将看看原生原型的详细信息,然后学习如何使用它为内建对象添加新功能。 Object.prototype 假如我们输出一个空对象: let obj = {}; alert( obj ); // "[object Object]" ? 生成字符串 "[object Object]

  • 问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输

  • 我使用代码Mat m=Mat(ROW,COL,CV_64F,results), 但是当我检查元素时,我发现值不匹配,m中的值非常奇怪,像5.325E-344(太小了!) COUT<(0,0)!=结果[0][0]

  • 问题内容: 我正在调查以下内容 当启动部署了servlet的jboss服务器时,就会发生这种情况。它是用jdk-1.5.0_11编译的,我尝试用jdk-1.5.0_15重新编译,但没有成功。编译运行正常,但是在部署时会发生。 当我更改方法名称并收到以下错误时: 你可以看到显示了更多的方法签名。 实际的方法签名是 我已经尝试过使用它进行查看,并且给出了应有的方法签名。 当我的其他同事签出代码,对其进