2009-03-13 9 views
0

Je ne suis pas sûr que je fais tout cela correctement. Est-ce parce que j'ouvre deux connexions? Je les ferme sans tenir compte des erreurs. J'ai essayé de mettre des champs de transaction internes et de mettre le second à RequiresNew. Les deux méthodes sont indépendantes les unes des autres, cependant, si l'une échoue, j'ai besoin à la fois de revenir en arrière. Je peux avoir besoin de modifier comment je crée et ferme les connexions, je pense. Des pensées? Voici quelques exemples de code de ce que je fais:Inner Transactionscope erreur: "La communication avec le gestionnaire de transactions sous-jacent a échoué"

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 

Répondre

1

Chaque fois que vous ouvrez plus de 1 connexion à l'aide TransactionScope, il change d'une transaction normale contre serveur SQL à une transaction distribuée, ce qui nécessite la mise en place du MSDTC.

Cela se produira même si les connexions ont la même chaîne de connexion, ce qui est l'un des problèmes «par conception». Je n'ai pas suivi s'il reste le même sur .net 3.5+

Questions connexes