2010-03-02 3 views
5

Cela vaut-il la peine d'utiliser System.Transactions.TransactionScope sur Linq to Entities?C# TransactionScope - L2E

Sur le MS documentation, il est dit que les appels SQL dans ObjectContext.SaveChanges() sont tous regroupés dans une transaction en interne.

Nous avons 1 connexion à une base de données, c'est-à-dire une base de données SQLite locale sur le système de fichiers. Nous voulons simplement nous assurer que toutes nos opérations vers la base de données sont atomiques, avons-nous besoin de TransactionScope? I.E. Lorsque nous demandons des suppressions, des mises à jour, des insertions, etc., nous voulons que tout se passe ou pas du tout.

Répondre

3

Jon, non, vous n'avez pas besoin d'utiliser TransactionScope. La simultanéité optimiste est gérée automatiquement par Linq. L'exemple de code dans le lien que vous fournissez explique que, plutôt, vous n'avez pas à annuler les transactions vous-même. Je voudrais utiliser le même code que dans l'exemple:

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"); 
    } 

Notez l'actualisation, ré-enregistrer, qui gère votre problème. Vous pouvez tester ceci en lançant une exception depuis le bloc try.

Cordialement

1

Si vous souhaitez inclure plus que le ObjectContext.SaveChanges dans une seule transaction (par exemple lit de données que vous allez changer, ainsi que les changements), vous devez utiliser TransactionScope.

0

Vous pouvez utiliser le code suivant si vous devez faire ce que Richard dit (mais il semble peu probable):

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; 
}