Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事务不回滚_C#_Sql Server_Transactions_Msmq_Transactionscope - Fatal编程技术网

C# 事务不回滚

C# 事务不回滚,c#,sql-server,transactions,msmq,transactionscope,C#,Sql Server,Transactions,Msmq,Transactionscope,我有一个交易,似乎没有回滚,并得到一个奇怪的错误。我使用的事务连接到不同服务器上的SQL Server 2008和与代码相同服务器上的MSMQ。下面是一个代码示例: void MyMethod() { try { using (var outterTrans = new TransactionScope()) { try {

我有一个交易,似乎没有回滚,并得到一个奇怪的错误。我使用的事务连接到不同服务器上的SQL Server 2008和与代码相同服务器上的MSMQ。下面是一个代码示例:

void MyMethod()
    {
       try
       {
           using (var outterTrans = new TransactionScope())
           {
               try
               {
                  InsertA();
                  SendTransactionMsmqMsg(new BlahObject());
               }
               catch (Exception e)
               {
                   //Exception is getting written here.
                   using (new TransactionScope(TransactionScopeOption.Suppress))                      
                      HandleException(e);

                    throw;
                }

                InsertB();
                outterTrans.Complete();
           }
        }
        catch(Exception e)
        {
            //Exception is getting written here too.
            HandleException(e);
        }
    }

    public void InsertA()
    {
       //Inserts data.
    }


    public void InsertB()
    {
       //Inserts data.
    }

    void SendTransactionMsmqMsg(object obj)
    {
         //When calling Msmq.Send I get 'The PROMOTE TRANSACTION request failed because there is no local transaction active.'
         Msmq.Send(CreateMessage(obj), MessageQueueTransactionType.Automatic);
    }
发生这种情况时,SendTransactionMsmqMsg之前的所有内容都不会回滚。这种情况也很少见。以下是一些堆栈跟踪:

Type : System.Transactions.TransactionAbortedException, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
    Message : The transaction has aborted.
    Source : System.Transactions
    Help link : 
    Data : System.Collections.ListDictionaryInternal
    TargetSite : Void CheckForFinishedTransaction(System.Transactions.InternalTransaction)
    Stack Trace :    at System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(InternalTransaction tx)
       at System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
       at System.Transactions.Transaction.Promote()
       at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
       at System.Transactions.TransactionInterop.GetDtcTransaction(Transaction transaction)
       at System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS properties, IntPtr transaction)
       at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
       at System.Messaging.MessageQueue.Send(Object obj, MessageQueueTransactionType transactionType)
       ********Functions from my code here********

        Inner Exception
        ---------------
        Type : System.Transactions.TransactionPromotionException, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
        Message : Failure while attempting to promote transaction.
        Source : System.Data
        Help link : 
        Data : System.Collections.ListDictionaryInternal
        TargetSite : Byte[] Promote()
        Stack Trace :    at System.Data.SqlClient.SqlDelegatedTransaction.Promote()
           at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
           at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)

            Inner Exception
            ---------------
            Type : System.Data.SqlClient.SqlException, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
            Message : The PROMOTE TRANSACTION request failed because there is no local transaction active.
            Source : .Net SqlClient Data Provider
            Help link : 
            Errors : System.Data.SqlClient.SqlErrorCollection
            Class : 16
            LineNumber : 1
            Number : 3965
            Procedure : 
            Server : <machine>
            State : 1
            ErrorCode : -2146232060
            Data : System.Collections.ListDictionaryInternal
            TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean)
            Stack Trace :    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
               at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
               at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
               at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
               at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
               at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
               at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
               at System.Data.SqlClient.SqlDelegatedTransaction.Promote()
类型:System.Transactions.TransactionBortedException,System.Transactions,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
消息:事务已中止。
资料来源:System.Transactions
帮助链接:
数据:System.Collections.ListDictionaryInternal
TargetSite:FinishedTransaction(System.Transactions.InternalTransaction)的无效检查
堆栈跟踪:在System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(内部事务发送)
在System.Transactions.EnstratableState.Promote(InternalTransaction tx)中
在System.Transactions.Transaction.Promote()中
at System.Transactions.TransactionInterop.ConvertToOletxTransaction(事务处理)
在System.Transactions.TransactionInterop.GetDTCtrTransaction(事务事务)
位于System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS属性,IntPtr事务)
位于System.Messaging.MessageQueue.SendInternal(对象obj、MessageQueueTransaction internalTransaction、MessageQueueTransactionType transactionType)
在System.Messaging.MessageQueue.Send(对象obj,MessageQueueTransactionType transactionType)
********这里是我代码中的函数********
内部异常
---------------
类型:System.Transactions.TransactionPromotionException,System.Transactions,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
消息:尝试升级事务时失败。
资料来源:System.Data
帮助链接:
数据:System.Collections.ListDictionaryInternal
TargetSite:字节[]升级()
堆栈跟踪:在System.Data.SqlClient.SqlDelegatedTransaction.Promote()处
在System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)上
在System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
内部异常
---------------
类型:System.Data.SqlClient.SqlException,System.Data,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
消息:升级事务请求失败,因为没有活动的本地事务。
源:.Net SqlClient数据提供程序
帮助链接:
错误:System.Data.SqlClient.SqlErrorCollection
班级:16
行号:1
电话:3965
程序:
服务器:
国家:1
错误代码:-2146232060
数据:System.Collections.ListDictionaryInternal
TargetSite:Void OnError(System.Data.SqlClient.SqlException,布尔值)
堆栈跟踪:位于System.Data.SqlClient.SqlConnection.OneError(SqlException异常,布尔breakConnection)
位于System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接)
位于System.Data.SqlClient.TdsParser.throweexception和warning()处
在System.Data.SqlClient.TdsParser.Run(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
在System.Data.SqlClient.TdsParser.TdsecuteTransactionManagerRequest(字节[]缓冲区,TransactionManagerRequestType请求,字符串transactionName,TransactionManagerIsolationLevel isoLevel,Int32超时,SqlInternalTransaction事务,TdsParserStateObject stateObj,布尔IsDeleteControlRequest)
在System.Data.SqlClient.SqlInternalConnectionDS.ExecuteTransactionYukon(TransactionRequest TransactionRequest、String transactionName、IsolationLevel iso、SqlInternalTransaction internalTransaction、Boolean IsDeleteGateControlRequest)
位于System.Data.SqlClient.SqlInternalConnectionDS.ExecuteTransaction(TransactionRequest TransactionRequest,字符串名称,IsolationLevel iso,SqlInternalTransaction internalTransaction,布尔IsDeleteGateControlRequest)
在System.Data.SqlClient.SqlDelegatedTransaction.Promote()中
我不确定我做错了什么以及是什么导致了这个问题。我似乎无法生成相同的异常,而我生成的每个异常都会回滚。有人知道我是如何产生这个错误的吗


谢谢大家的帮助

DTC是否在事务内部所做工作涉及的所有服务器上运行?是否所有流程都有适当的访问权限

此帖子与您收到的错误消息相同:

更新


正在实例化的消息队列对象在哪里?我会尝试在事务范围内实例化它。

是的,DTC正在所有服务器上运行。除了这个例外,提交和回滚似乎可以正常工作。这几乎就像是在MSMQ.Send调用之前创建了事务,但不知何故删除了事务,这就是错误的原因。因为事务已被删除,所以提交了第一部分,因为它是单个事务。或者TransactionScope检测到异常,因此它从来都不是事务的一部分,因此第一部分已提交,因为它是单个事务,并且在调用MSMQ时。Send it检测不到任何事务,这就是错误的原因。请参阅我的更新以获取其他尝试。某些原因导致数据库调用或MSMQ send未登记在transactionscope事务中。它是在构造函数中创建的,并且多个线程正在使用该对象。思考