Внутренняя ошибка Транзакции: «Не удалось установить связь с соответствующим менеджером транзакций» - PullRequest
0 голосов
/ 14 марта 2009

Я не уверен, что делаю все это правильно. Это потому, что я открываю две связи? Я закрываю их независимо от ошибок. Я попытался вставить некоторые внутренние области транзакций и установить для второй значение RequiresNew. Эти два метода не зависят друг от друга, однако, если один из них не удается, мне нужно, чтобы оба откатились. Возможно, мне придется изменить то, как я создаю и закрываю связи. Какие-нибудь мысли? Вот пример кода того, что я делаю:

Public Sub TransMethod()
    Using sTran As New Transactions.TransactionScope
        factory1.UpdateMethod(someObject1)
        facotry2.insert(someobject2)
        sTran.Complete()
    End Using
End Sub

Public Class factory1
    Public Shared Sub UpdateMethod(obj)
        dim someSQLParams....
        DataAcces.ExecuteNonQuery(command,someSQLParams)
    End Sub
End Class

Public Class factory2
    Public Shared Sub Insert(obj)
        dim someSQLParams....
        DataAcces.ExecuteNonQuery(command,someSQLParams)
    End Sub
End Class

Public Function ExecuteNonQuery(ByVal spname As String, _
        ByVal ParamArray parameterValues() As Object) As Object
    Dim connection As SqlConnection = Nothing            
    Dim command As SqlCommand = Nothing
    Dim res As Object = Nothing
    Try
        connection = New SqlConnection(_connectionString)
        command = New SqlCommand(spname, connection)
        command.CommandType = CommandType.StoredProcedure
        command.Parameters.AddRange(parameterValues)
        connection.Open()
        command.ExecuteNonQuery()
        res = command.Parameters(command.Parameters.Count - 1).Value
    Catch ex As Exception
        CreateDataEntry(ex, WriteType.ToFile, spname)
        If Not (transaction Is Nothing) Then
            transaction.Rollback()
        End If
    Finally
        If Not (connection Is Nothing) AndAlso _
            (connection.State = ConnectionState.Open) Then _
                connection.Close()
        If Not (command Is Nothing) Then command.Dispose()
    End Try
    Return res
End Function

1 Ответ

1 голос
/ 14 марта 2009

Всякий раз, когда вы открываете более 1 соединения с помощью TransactionScope, оно меняется с обычной транзакции на сервере SQL на распределенную транзакцию, которая требует настройки MSDTC.

Это произойдет, даже если соединения имеют одну и ту же строку соединения, что является одной из проблем «по замыслу». Я не отслеживал, остается ли он таким же на .net 3.5 +

...