2010-08-26 4 views
0

J'ai une requête SQL Server (en utilisant l'ORM LLBL, si cela est important pour la question) qui effectue une grande extraction sur un ensemble de tables connexes.Les enregistrements sont verrouillés sur un RepeatableRead

Cette requête est en cours d'exécution dans une transaction avec le niveau d'isolement de lecture répétable et est filtrée par deux colonnes "state" dans la table principale de la requête.

Est-ce que les enregistrements verrouillés en écriture seront ceux qui correspondent au filtre de la table principale ou bien tous les enregistrements seront effectivement verrouillés jusqu'à la fin de la récupération? Je suppose que le dernier sera nécessaire pour s'assurer qu'aucun nouvel enregistrement n'est ajouté au jeu de résultats pendant la transaction.

Répondre

1

pour assurer pas de nouveaux enregistrements sont ajoutés à le jeu de résultats lors de la transaction

Cela nécessite niveau d'isolation sérialisable. Répétable Lecture seule garantit que les lignes lues pourront être relues plus tard dans la transaction, mais n'empêche pas une transaction concurrente d'insérer nouvelles lignes et ces nouvelles lignes seront visibles, dans la transaction d'origine, après leur validation par l'insert. Sous Serializable Read les verrous s'étendront à des plages, donc aucun nouveau enregistrement qui satisfera le filtre n'apparaîtra. En fonction du schéma de la table (index disponibles), la restriction peut s'étendre à à la totalité des tables. Vous devriez envisager sérieusement de tout faire sous Snapshot Isolation, cela résout presque toutes les anomalies connues, mais coûte plus cher sur les ressources, voir Row Versioning Resource Usage.

Questions connexes