Estoy tratando de usar un ámbito de transacción dentro de un ciclo. Todo el ciclo se lleva a cabo utilizando una única conexión a la base de datos. Estoy usando el marco de entidad 4 para el acceso a la base de datos. Durante la segunda iteración del ciclo, cuando se ejecuta la consulta LINQ to Entites, se lanza una excepción que indica que el MSDTC en el servidor no está disponible.TransactionScope siempre intenta promocionar a MSDTC
He leído que la apertura explícita de la conexión y luego alistar la transacción se supone que resuelve este problema, pero no es así. A continuación se muestra un código de muestra que refleja la operación básica que está teniendo lugar.
¿Alguna idea sobre cómo prevenir una escalada a MSDTC?
Using context = New MyEntities()
Dim connection = context.Connection
connection.Open()
For index = 0 to (Me.files.Count - 1)
Dim query = From d In context.Documents
Where (d.DocumentID = documentID)
Select d.Status
Dim status = query.FirstOrDefault()
Using trans = New TransactionScope()
connection.EnlistTransaction(Transaction.Current)
Dim result = context.UpdateStatus(True)
If (result = 1) Then
WriteToFile()
trans.Complete()
End If
End Using
Next
End Using
Editar: En lugar de TransactionScope, si uso connection.BeginTransaction(), transaction.Commit(), y transaction.Rollback(), que funciona bien. Sin embargo, aún me gustaría encontrar una forma de hacer que TransactionScope funcione.
¿Le sirve este foro? http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/c3fd7555-7fff-44b8-8e1e-030073c20597/ Parece que la recomendación es iniciar la transacción, luego abrir la conexión, luego ejecutar tus consultas – mkedobbs
La idea era abrir la conexión, luego ejecutar todas las consultas utilizando una conexión, por razones de rendimiento. – NYSystemsAnalyst
No hay razones de rendimiento para esto si usa la agrupación de conexiones. –