SqlTransaction 已完成,不再可用,回滚问题

SqlTransaction has completed, it is no longer usable, rollback issue

我偶尔会遇到此错误消息:

The SqlTransaction has completed; it is no longer usable.

我不确定是什么原因导致此错误弹出,我已尝试将 SQL 超时设置为无穷大。

是不是我代码结构的问题?

这在小群用户时不会发生,但在大群用户时经常发生。

Public Function PostCustomerSet(ByVal ds As CustomerHeaderDetailDataSet, ByVal Table As String, ByRef SessionKeys As String, ByRef errMsg As String, ByVal SubmitType As Integer, ByVal callWrapper As Boolean) As String
    errMsg = Nothing
    Dim newkey As PrimaryKey
    Dim oldkey As PrimaryKey
    Try
        transaction = EnterpriseUtils.StartTransaction(Connection1, m_Dict)
        If ds.CustomerHeader.Rows.Count > 0 Then
            Dim SessionKey As PrimaryKey = PrimaryKey.FromString(SessionKeys)
            Dim CustomerHeaderKey As PrimaryKey = EnterpriseUtils.VerifyDataRowKeys(ds.CustomerHeader.Rows(0), SessionKey, SubmitType)
            Dim OldCustomerHeaderKey As PrimaryKey = New PrimaryKey(CustomerHeaderKey)
            newkey = CustomerHeaderKey
            oldkey = OldCustomerHeaderKey

            If CustomerHeaderKey Is Nothing Then
                Return Nothing
            Else
                If ds.CustomerHeader.Rows.Count > 0 Then 'check if record was not deleted during update
                    CustomerHeaderKey.Update(ds.CustomerHeader(0))
                    If SubmitType = 1 Then
                        EnterpriseUtils.UpdateTemporaryLinks("CustomerNumber", CustomerHeaderKey, OldCustomerHeaderKey, "CustomerDetail", transaction)
                        EnterpriseUtils.UpdateTemporaryLinks("CustomerNumber", CustomerHeaderKey, OldCustomerHeaderKey, "CustomerMultiPayments", transaction)
                    End If


                    If callWrapper AndAlso ds.CustomerHeader(0).CustomerNumber.ToUpper <> "DEFAULT" Then
                        Dim Command As SqlCommand = New SqlCommand("enterprise.Customer_Control", Connection1)
                        Command.CommandType = CommandType.StoredProcedure
                        Command.Transaction = transaction
                        Dim parameter As SqlParameter
                        '@CompanyID
                        parameter = New SqlParameter("@CompanyID", SqlDbType.NVarChar, 36)
                        parameter.Value = ds.CustomerHeader(0).CompanyID
                        Command.Parameters.Add(parameter)
                        'DivisionID
                        parameter = New SqlParameter("@DivisionID", SqlDbType.NVarChar, 36)
                        parameter.Value = ds.CustomerHeader(0).DivisionID
                        Command.Parameters.Add(parameter)
                        '@DepartmentID
                        parameter = New SqlParameter("@DepartmentID", SqlDbType.NVarChar, 36)
                        parameter.Value = ds.CustomerHeader(0).DepartmentID
                        Command.Parameters.Add(parameter)
                        '@DocumentNumber
                        parameter = New SqlParameter("@DocumentNumber", SqlDbType.NVarChar, 36)
                        parameter.Value = ds.CustomerHeader(0).CustomerNumber
                        Command.Parameters.Add(parameter)
                        Command.ExecuteNonQuery()
                    End If
                End If
                transaction.Commit()
                transaction = Nothing
                Return CustomerHeaderKey.ToString()
            End If
        ElseIf ds.CustomerDetail.Count > 0 Then
            CustomerDetail_Adapter.Update(ds.CustomerDetail)
            transaction.Commit()
            transaction = Nothing
        ElseIf ds.CustomerMiscCharges.Count > 0 Then
            CustomerMiscCharges_Adapter.Update(ds.CustomerMiscCharges)
            transaction.Commit()
            transaction = Nothing
        ElseIf ds.CustomerMultiPayments.Count > 0 Then
            CustomerMultiPayment_Adapter.Update(ds.CustomerMultiPayments)
            transaction.Commit()
            transaction = Nothing
        End If
        Return Nothing       
    Catch e As SqlException
        errMsg = "Please contact your system administrator. (code number: " + e.Number + ")" 'Message + ")"
        WebUtils.ProcessError(e, errMsg, EDIErrorType.SendEmailNotification Or EDIErrorType.WriteLog)
        Return Nothing
    Catch e As Exception
        errMsg = e.Message
        WebUtils.ProcessError(e, errMsg, EDIErrorType.SendEmailNotification Or EDIErrorType.WriteLog)
        Return Nothing
    Finally
        If Not transaction Is Nothing Then
            transaction.Rollback()
        End If
        If Connection1.State = ConnectionState.Open Then
            Connection1.Close()
        End If
    End Try
End Function

谁能给我一些提示,我做错了什么?

在此先致谢。

您正在设置
transaction = Nothing

之后
transaction.Commit()

是什么原因导致的,需要在Finally Method后将其设置为nothing。

Public Function PostCustomerSet(ByVal ds As CustomerHeaderDetailDataSet, ByVal Table As String, ByRef SessionKeys As String, ByRef errMsg As String, ByVal SubmitType As Integer, ByVal callWrapper As Boolean) As String
errMsg = Nothing
Dim newkey As PrimaryKey
Dim oldkey As PrimaryKey
Try
    transaction = EnterpriseUtils.StartTransaction(Connection1, m_Dict)
    If ds.CustomerHeader.Rows.Count > 0 Then
        Dim SessionKey As PrimaryKey = PrimaryKey.FromString(SessionKeys)
        Dim CustomerHeaderKey As PrimaryKey = EnterpriseUtils.VerifyDataRowKeys(ds.CustomerHeader.Rows(0), SessionKey, SubmitType)
        Dim OldCustomerHeaderKey As PrimaryKey = New PrimaryKey(CustomerHeaderKey)
        newkey = CustomerHeaderKey
        oldkey = OldCustomerHeaderKey

        If CustomerHeaderKey Is Nothing Then
            Return Nothing
        Else
            If ds.CustomerHeader.Rows.Count > 0 Then 'check if record was not deleted during update
                CustomerHeaderKey.Update(ds.CustomerHeader(0))
                If SubmitType = 1 Then
                    EnterpriseUtils.UpdateTemporaryLinks("CustomerNumber", CustomerHeaderKey, OldCustomerHeaderKey, "CustomerDetail", transaction)
                    EnterpriseUtils.UpdateTemporaryLinks("CustomerNumber", CustomerHeaderKey, OldCustomerHeaderKey, "CustomerMultiPayments", transaction)
                End If


                If callWrapper AndAlso ds.CustomerHeader(0).CustomerNumber.ToUpper <> "DEFAULT" Then
                    Dim Command As SqlCommand = New SqlCommand("enterprise.Customer_Control", Connection1)
                    Command.CommandType = CommandType.StoredProcedure
                    Command.Transaction = transaction
                    Dim parameter As SqlParameter
                    '@CompanyID
                    parameter = New SqlParameter("@CompanyID", SqlDbType.NVarChar, 36)
                    parameter.Value = ds.CustomerHeader(0).CompanyID
                    Command.Parameters.Add(parameter)
                    'DivisionID
                    parameter = New SqlParameter("@DivisionID", SqlDbType.NVarChar, 36)
                    parameter.Value = ds.CustomerHeader(0).DivisionID
                    Command.Parameters.Add(parameter)
                    '@DepartmentID
                    parameter = New SqlParameter("@DepartmentID", SqlDbType.NVarChar, 36)
                    parameter.Value = ds.CustomerHeader(0).DepartmentID
                    Command.Parameters.Add(parameter)
                    '@DocumentNumber
                    parameter = New SqlParameter("@DocumentNumber", SqlDbType.NVarChar, 36)
                    parameter.Value = ds.CustomerHeader(0).CustomerNumber
                    Command.Parameters.Add(parameter)
                    Command.ExecuteNonQuery()
                End If
            End If
            transaction.Commit()
            transaction = Nothing
            Return CustomerHeaderKey.ToString()
        End If
    ElseIf ds.CustomerDetail.Count > 0 Then
        CustomerDetail_Adapter.Update(ds.CustomerDetail)
        transaction.Commit()

    ElseIf ds.CustomerMiscCharges.Count > 0 Then
        CustomerMiscCharges_Adapter.Update(ds.CustomerMiscCharges)
        transaction.Commit()

    ElseIf ds.CustomerMultiPayments.Count > 0 Then
        CustomerMultiPayment_Adapter.Update(ds.CustomerMultiPayments)
        transaction.Commit()

    End If
    Return Nothing       
Catch e As SqlException
    errMsg = "Please contact your system administrator. (code number: " + e.Number + ")" 'Message + ")"
    WebUtils.ProcessError(e, errMsg, EDIErrorType.SendEmailNotification Or EDIErrorType.WriteLog)
    Return Nothing
Catch e As Exception
    errMsg = e.Message
    WebUtils.ProcessError(e, errMsg, EDIErrorType.SendEmailNotification Or EDIErrorType.WriteLog)
    Return Nothing
Finally
    If Not transaction Is Nothing Then
        transaction.Rollback()
    End If
    If Connection1.State = ConnectionState.Open Then
        Connection1.Close()
    End If
End Try
transaction = Nothing

结束函数