2010-03-02 14 views
5

¿Vale la pena utilizar System.Transactions.TransactionScope en Linq to Entities?C# TransactionScope - L2E

En el MS documentation, dice que las llamadas SQL dentro de ObjectContext.SaveChanges() se incluyen dentro de una transacción internamente.

Tenemos 1 conexión de base de datos, que es una base de datos SQLite local en el sistema de archivos. Solo queremos asegurarnos de que todas nuestras operaciones en la base de datos sean atómicas, ¿necesitamos de TransactionScope? I.E. cuando pedimos algunas eliminaciones, actualizaciones, inserciones, etc., queremos que sucedan todas o que ninguna.

Respuesta

3

Jon, no, no necesita usar TransactionScope. La concurrencia optimista es manejada automáticamente por Linq. El ejemplo de código en el enlace que proporciona explica que, en realidad, no es necesario que deshaga las transacciones usted mismo. Utilizaría el mismo código que en la muestra:

try 
    { 
     // Try to save changes, which may cause a conflict. 
     int num = context.SaveChanges(); 
     Console.WriteLine("No conflicts. " + 
      num.ToString() + " updates saved."); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     // Resolve the concurrency conflict by refreshing the 
     // object context before re-saving changes. 
     context.Refresh(RefreshMode.ClientWins, orders); 

     // Save changes. 
     context.SaveChanges(); 
     Console.WriteLine("OptimisticConcurrencyException " 
     + "handled and changes saved"); 
    } 

Observe la actualización, vuelva a guardar, que maneja su problema. Puede probar esto lanzando una excepción desde dentro del bloque try.

Saludos

1

Si desea incluir más de la ObjectContext.SaveChanges en una sola transacción (por ejemplo, lecturas de datos que se va a cambiar, así como los cambios), entonces usted necesita para hacer uso de TransactionScope.

0

Usted podría utilizar el siguiente código si tiene que hacer lo que dice Richard (aunque parece bastante improbable):

TransactionManager transactionManager = null; 

try 
{ 
    bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction; 
    transactionManager = ConnectionScope.ValidateOrCreateTransaction(true); 

    //MANY SAVES 

    if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Commit(); 
} 
catch (Exception ex) 
{ 
    if (transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Rollback(); 
    log.Error("An unexpected Exception occurred", ex); 
    throw; 
} 
Cuestiones relacionadas