首页 > 解决方案 > 使用单个事务范围时获取 TransactionInDoubtException

问题描述

我以以下方式使用事务范围,

var option1 = new TransactionOptions();
        option1.IsolationLevel = IsolationLevel.ReadCommitted;
        option1.Timeout = TimeSpan.FromSeconds(Convert.ToInt32(ConfigurationManager.AppSettings["Tide:TransactionTimeout"]))
using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, option1))
                {
                        //delete data from database
                        //multiple BulkInsertData in different tables of database
                        //update data
                        transactionScope.Complete();
                }

没有内部事务开始。我得到了 TransactionInDoubtException,我不明白它为什么会发生。之前的代码运行流畅,但是从昨天开始突然抛出这个异常

System.Transactions.TransactionInDoubtException:事务有问题。---> System.Data.SqlClient.SqlException:COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action`1 wrapCloseInAction)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔 callerHasConnectionLock,布尔 asyncClose)在 System.Data.SqlClient.TdsParser System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、

标签: sql-serverazure-sql-databasetransactionscope

解决方案


从异常消息

COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION

您似乎正在运行一些未正确处理错误的 SQL。你在运行的 SQL 中有这样的东西吗?

BEGIN TRAN

-- Some SQL here that generates an error

COMMIT TRAN

在这种情况下,BEGIN TRAN...子句中的任何错误都会导致事务失败。何时COMMIT TRAN调用事务状态无法确定,因此出现TransactionInDoubt异常。您需要确保SET XACT_ABORT ON在程序开始时调用并正确处理错误:

SET XACT_ABORT, NOCOUNT ON
BEGIN TRY
    BEGIN TRAN
   -- Some SQL here that generates an error
    COMMIT TRAN
END TRY
BEGIN CATCH
   IF @@trancount > 0 ROLLBACK TRANSACTION
   DECLARE @msg nvarchar(2048) = error_message()
   RAISERROR (@msg, 16, 1)
   RETURN 55555
END CATCH

请参阅这篇关于 SQL Server 中的错误处理的文章


推荐阅读