Je suis confronté à des situations dans mon application où j'ai besoin d'utiliser des indicateurs de verrouillage de table ou de définir le niveau d'isolation des transactions sur autre chose que la valeur par défaut validée, afin de résoudre les problèmes de blocage. J'utilise une architecture orientée services, chaque appel de service fonctionnant comme une opération atomique, et Linq To Sql sert de DAL léger. Chaque appel de service appelle ma couche d'affaires et déclare une nouvelle transaction comme celui-ci:Plusieurs niveaux d'isolation requis pour un TransactionScope?
using (var scope = new TransactionScope())
{
// Get datacontext
// do Business Logic stuff, including database operations via Linq To Sql
// Save transaction
scope.Complete();
}
Le problème est parfois j'ai compliqué la logique métier qui nécessite de nombreuses opérations de base de données. Certaines lectures, certaines écritures, certaines lectures pour la mise à jour, etc, tous dans le même appel de service, et donc la même transaction.
J'ai lu à propos de l'incapacité de Linq To Sql à ajouter des indications de verrouillage de table à votre requête linq, avec la solution suggérée d'utiliser les niveaux d'isolation de TransactionScope à la place. C'est génial et tout, mais dans ma situation, où chaque transaction est dans le but d'un appel de service atomique, je ne vois pas où cela fonctionnerait. Par exemple, si j'ai besoin de lire une table sans verrouillage et que les lectures incorrectes peuvent être correctes, faites demi-tour et faites une autre lecture dans le but de mettre à jour, et faites une mise à jour. Je ne veux pas mettre Read Uncommitted pour la transaction entière, seulement une lecture particulière, alors que dois-je faire?
est-il pas une extension que je peux mettre en œuvre qui me permettra d'ajouter des notes de verrouillage de table, sans utiliser des vues ou des procédures stockées, ou à l'aide datacontext.ExecuteQuery (« ma chaîne sql cru ici »)