Éviter un blocage simultané supprimer
J'ai un tableau appelé "Produits", qui a beaucoup de colonnes.
C'est une table temporaire utilisé pour fins de rapport. Les données seront traitées à cette table en même temps par plusieurs demandes de l'utilisateur.(séparée de la procédure Stockée à faire des opérations DML à cette table)
Structure De La Table:
Create table Produits
(exemple de type uniqueidentifier
inséré datetime,
col1, col2,...)
Colonne insérée sera remplie avec GETDATE (), quand les données sont insérées. De l'instance et de la colonne ont la fonction newid() de la valeur. une demande de l'utilisateur disposera d'un identifiant unique; peut avoir des millions de lignes. Ci-dessous sont les requêtes qui seront exécutées simultanément, ce qui provoque le blocage. Merci de me conseiller
Requête1:
"Set transaction isolation readuncommitted
Supprimer P à partir de Produits (Nolock) où instance = 'XXXX-xxx-xxx-xx'"
Query2:
"Set transaction isolation readuncommitted
Supprimer P à partir de Produits (Nolock) où inséré<=DATEADD(hh, -10, getdate())"
Remarque: L'index non-cluster est créé sur colonne d'instance.
Merci de me conseiller qui verrouillent je peux utiliser dans ce scénario.
Remarque, je ne pourrais pas en mesure de clé primaire comme elle est consommatrice de temps lorsque j'insère de 10 millions de lignes de la table (ce qui pour une transaction; il y a 20 simultanées opérations).
Le rapport doit être généré plus tôt. Et mon intervention a plusieurs 35 DML relevés, il y a environ 15 DELETE par exemple colonne avec les autres colonnes( DElete from table where instance = @instance et col1 = @col1).
- Jetez un oeil à cette stackoverflow.com/questions/9952137/...
Vous devez vous connecter pour publier un commentaire.
(1) Vous devez cesser d'utiliser
read uncommitted
isolement. Utiliser au moinsread committed
.(2) Il y a un certain nombre de choses que vous pourriez essayer d'éviter les blocages, de s'assurer vos différentes transactions de base de données access objets dans le même ordre, etc. Ce serait intéressant à lire - http://support.microsoft.com/kb/169960
(3) Désactiver l'escalade de verrous pour votre table (plus granulaire des serrures afin de mieux la concurrence, mais plus de verrouillage de frais généraux):
(4) Interdire les Verrous de Page et permettent de les Verrous de Ligne sur votre index (signifie que vous ne pouvez pas defrag index, mais vous pouvez toujours reconstruire):
Tout d'abord, il n'y a pas de verrouillage que vous pouvez prendre sur ces delete outre un verrou exclusif. Votre niveau d'isolement et
NOLOCK
indicateurs sont ignorés par Sql Server:Deux suggestions:
Changer votre index non ordonné en clusters sur
instance
à un index cluster. MAIS, ne faites cela que si vous pouvez changerNEWID()
àNEWSEQUENTIALID()
.Seconde, au lieu d'effectuer une
delete
pour supprimer les enregistrements de plus de 10 heures... envisager la mise en œuvre de rolling partitions. Cela permettra d'éliminer toute discorde causée par le nettoyage avec vos autresdelete
opérations.