2009-03-13 6 views
0

Ich bin mir nicht sicher, ob ich irgendetwas richtig mache. Liegt es daran, dass ich zwei Verbindungen öffne? Ich schließe sie unabhängig von Fehlern. Ich habe versucht, einige innere Transaktionsbereiche hinzuzufügen und den zweiten auf RequiresNew zu setzen. Die beiden Methoden sind voneinander unabhängig, aber wenn einer fehlschlägt, müssen beide beide zurückgesetzt werden. Ich muss vielleicht ändern, wie ich die Verbindungen erschaffe und schließe. Irgendwelche Gedanken? Hier einige Beispiel-Code von dem, was ich tue:Innerer Transaktionssteuerungsfehler: "Die Kommunikation mit dem zugrunde liegenden Transaktionsmanager ist fehlgeschlagen"

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 

Antwort

1

Jedes Mal, wenn Sie mehr als 1 Verbindung öffnen mit Transaction, es ändert sich von einer normalen Transaktion gegen SQL Server zu einer verteilten Transaktion, die den MSDTC-Einrichtung erfordert.

Das passiert auch, wenn die Verbindungen die gleiche Verbindungszeichenfolge haben, was eines der "by design" Probleme ist. Ich habe nicht weiter verfolgt, wenn es auf .net 3.5+

gleich bleibt