2010-07-06 5 views
3

Utilisation de Sql Server 2005. J'ai une mise à jour longue durée qui peut prendre environ 60 secondes dans notre environnement de production. La mise à jour ne fait partie d'aucune transaction explicite et ne comporte aucune indication SQL. Pendant la mise à jour, que devez-vous attendre des autres demandes qui se produisent sur ces lignes qui seront mises à jour? Il y a environ 6 millions de lignes au total dans la table qui seront mises à jour dont environ 500 000 lignes seront mises à jour.Concurrence pendant une mise à jour longue durée dans TSQL

Quelques préoccupations/questions simultanéité:

1) si une autre requête de sélection (avec indication nolock) est effectuée sur ce tableau parmi quelques-unes des lignes qui sont mises à jour. La requête va-t-elle attendre la fin de la mise à jour?

2) Qu'est-ce que l'autre requête select n'a pas d'indice nolock? Cette requête devra-t-elle attendre la fin de la mise à jour?

3) Que se passe-t-il si une autre requête de mise à jour effectue une mise à jour sur l'une de ces lignes? Cette requête devra-t-elle attendre jusqu'à la fin?

4) Qu'en est-il des suppressions?

5) Qu'en est-il des inserts?

Merci! Dave

Répondre

0

Chaque instruction du serveur SQL s'exécute dans une transaction. Si vous n'en démarrez pas explicitement un, le serveur en lance un pour chaque instruction et le valide si la déclaration est réussie, et la restaure si ce n'est pas le cas.

Le verrouillage exact que vous verrez avec votre update, dépend malheureusement. Il commencera comme les verrous de ligne, mais il est probable qu'il sera élevé à au moins quelques verrous de page en fonction du nombre de lignes que vous mettez à jour. L'élévation complète d'un verrou de table est peu probable, mais cela dépend d'une certaine quantité sur votre serveur - SQL Server l'élèvera si les verrous de page utilisent trop de mémoire.

Si votre select est exécuté avec nolock alors vous obtiendrez des lectures sales si vous sélectionnez les lignes impliquées dans la mise à jour. Cela signifie que vous lirez les données non validées et qu'elles ne seront peut-être pas cohérentes avec les autres lignes (puisque celles-ci n'ont peut-être pas encore été mises à jour).

Pour tous les autres cas, si votre instruction rencontre une ligne impliquée dans la mise à jour ou une ligne sur une page verrouillée (en supposant que le verrou a été élevé), l'instruction devra attendre la fin du update.