est-il possible d'utiliser le système de programmation System.Transactions sans prendre en charge les transactions distribuées?
Quelque chose comme p>
3 Réponses :
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. P>
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.
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. P>
Pour éviter escalade de la gestion des transactions Vous devez: P >
avoir SQL Server 2005 ou supérieur à Votre base de données p> li>
Si SQL Server 2005, utilisez une seule connexion de base de données pour la durée de vie de la transaction. (SQL Server 2008 vous permettra d'utiliser plusieurs connexions dans une transaction sans promotion.) P> li>
Accédez uniquement à une base de données p> li>
ne pas réussir votre transaction à travers Domaines d'application P> LI> ul>
À titre d'exemple, supposons une minute que vous Ainsi, l'utilisation d'une propriété DisablePromotion n'aurait pas beaucoup de valeur puisque, pour la demande de ne pas promouvoir la transaction, Si vous vouliez vraiment, vous pouvez gérer le DistributedTransactionStarté événement et lancez une exception lorsqu'une transaction distribuée est lancée. Cela garantirait que votre application n'utilise pas de transactions distribuées, mais ce qui n'est probablement pas ce que vous voulez. P>
La raison des règles est d'assurer la Propriétés acides a> de la transaction. p>
Si votre transaction est favorisée parce que vous accédez à deux bases de données, mais vous êtes uniquement écrire i> à 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} code>
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(); } } } } }
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.