8
votes

.NET: Comment désactiver la promotion dans le système.Transactions?

est-il possible d'utiliser le système de programmation System.Transactions sans prendre en charge les transactions distribuées?

Quelque chose comme xxx


2 commentaires

Quel problème avez-vous qui vous donne envie de désactiver la promotion?


J'utilise un serveur lié pour connecter deux serveurs SQL. Pour la logique de serveur liée, j'ai utilisé des transactions explicites, l'intégrité est donc bien bien. Mais lorsque j'ai fini avec le serveur Linked Server SQL Server ne libère pas la connexion interne. Lorsque ma demande continue et utilise des transactions implicites (pour la simplicité), elles fonctionnent toujours contre une base de données. Mais la promotion se produit car la connexion de serveur liée est toujours ouverte.


3 Réponses :


3
votes

Je ne pense pas qu'il y ait une façon directe de désactiver la promotion. Vous voudrez peut-être examiner les situations qui causent une transaction à être promu. Juval Lowy a écrit un excellent blanc (aussi téléchargeable ici ) Tout sur le système.Transactions. Il couvre les règles de promotion en détail.


2 commentaires

Vous pouvez également trouver une version HTML du système d'introduction de Juval Lowy.Transactions à MSDN.MicRosoft .Com / fr-US / bibliothèque / ms973865.aspx


Excellent papier blanc. Merci beaucoup.



11
votes

Non, vous ne pouvez pas désactiver la promotion des transactions via une propriété ou une configuration. Le seul moyen de désactiver la promotion de la transaction est d'éviter les conditions qui entraînent la promotion de la transaction à une transaction distribuée.

Pour éviter escalade de la gestion des transactions Vous devez:


1 commentaires

Si votre transaction est favorisée parce que vous accédez à deux bases de données, mais vous êtes uniquement écrire à une base de données, il vous est possible d'éviter la promotion en superposant la transaction lors de l'accès à l'autre DB. I.e. Utilisation (Nouveau transactionsCope (transactionsCOPOPEOPTION.Suppress, nouvelle transactionOPTIONS {IsolationLevel = isolationlevel.readuncommited})) {// Accédez à d'autres dB}



1
votes

J'utilise le code suivant avec le service MSDTC désactivé.

var txOpts = new TransactionOptions
          {
            IsolationLevel = IsolationLevel.ReadCommitted, 
            Timeout = TimeSpan.FromMinutes(10)};

using (var tx = new TransactionScope(TransactionScopeOption.Suppress, txOpts))
{
  using (var db1 = new ObjectContext(connection1))
  {
    db1.Connection.Open();
    using (var db1tx = db1.Connection.BeginTransaction(
                                System.Data.IsolationLevel.ReadCommitted))
    {
      using (var db2 = new ObjectContext(connection2))
      {
        db2.Connection.Open();
        using (var db2tx = db2.Connection.BeginTransaction(
                          System.Data.IsolationLevel.ReadCommitted))
        {
          // do stuff

          db1.SaveChanges(false);
          db2.SaveChanges(false);

          db1tx.Commit();
          db2tx.Commit();
          tx.Complete();
        }
      }
    }
  }
}


0 commentaires