.net - transacciones - transaction entity framework 5
TransactionScope siempre intenta promocionar a MSDTC (2)
¿Revisaste la descripción de EnlistTransaction
en MSDN ? Dice:
Lo nuevo en ADO.NET 2.0 es compatible con el uso del método EnlistTransaction para enlistar en una transacción distribuida. Como enlista una conexión en una instancia de transacción, EnlistTransaction aprovecha la funcionalidad disponible en el espacio de nombres System.Transactions para administrar transacciones distribuidas. Una vez que una conexión se alista explícitamente en una transacción, no puede ser anulada o enlistada en otra transacción hasta que la primera transacción finalice.
Solo menciona transacciones distribuidas. Puede intentar usar connection.BeginTransaction
lugar. EntityTransaction
instancia de EntityTransaction
y llamará a Commit
para completar la transacción.
Estoy tratando de usar un alcance de transacción dentro de un bucle. 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.
He leído que se está abriendo explícitamente la conexión y que al 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 (), funciona bien. Sin embargo, aún me gustaría encontrar una forma de hacer que TransactionScope funcione.
TransactionScope
originalmente tenía un problema en el que promovía una transacción a una transacción distribuida cuando se encontraba con otra conexión, incluso si todas las conexiones estaban en la misma base de datos. Este era un problema conocido en el marco.
Creo que abordaron esto en .NET 4, ¿qué versión estás usando?
Se ha proporcionado una solución en esta respuesta:
¿Por qué TransactionScope utiliza una transacción distribuida cuando solo uso LinqToSql y Ado.Net?
Básicamente, es lo mismo que el comentario de su pregunta, que sugiere usar solo una conexión física del grupo, por lo que solo se conecta una conexión.
Revisando su pregunta nuevamente, puedo ver que lo anterior probablemente no sea diferente, ya que solo usa una conexión de todos modos. Tal vez intente cerrar y volver a abrir la conexión en cada iteración explícitamente, y use los beneficios de la agrupación de conexiones.
O más idealmente, deje de utilizar TransactionScope
ya que IDbTransaction
tiene suficiente alcance aquí para cubrir su código.