MISE À JOUR + AVEC (VERROU) + CTE
Je ne trouve pas de documentation sur la syntaxe de l'instruction T-SQL:
J'ai besoin de faire un AVEC (VERROU) mise à JOUR sur un CTE résultat.
Quelque chose comme: (donc, mis à jour sera top1000 table1.col2. ** Déclaration (VERROU) lors d'une mise à JOUR sur les lignes de la table table1 est cruciale **)
;WITH CTE AS
(
SELECT TOP(1000) table1.col2
FROM table1 INNER JOIN table2 ON table1.id = table2.id
)
UPDATE CTE WITH (ROWLOCK)
SET col2 = 1
MODIFIER
La déclaration ci-dessus est probablement syntaxiquement correct, cependant, si quelqu'un va trouver un tel exemple, merci de me donner un lien.
MAIS: mon sql ressemble à ci-dessous. Pendant l'exécution j'obtiens l'erreur: "Conflit de verrouillage sont spécifiés pour la table "table1". Cela peut être causé par un conflit d'indice spécifié pour une vue." Pourquoi ne puis-je pas utiliser AVEC (NOLOCK) pour la sélection et AVEC (VERROU) sur la mise à jour ?
;WITH CTE AS
(
SELECT TOP(5) table1.col2
FROM table1 WITH (NOLOCK) INNER JOIN table2 WITH (NOLOCK) ON table1.id = table2.id
WHERE table1.col3 = 2
ORDER BY table1.id
)
UPDATE CTE WITH (ROWLOCK)
SET col2 = 1
Merci pour la réponse. Je n'étais pas capable de google tout exemple de code avec une telle 'sql combinaison. Voyez-vous de la page? Étrange, quelqu'un doit avoir besoin avant 🙂 Oui, j'ai de l'ORDRE PAR en finale de sql, c'est seulement à court exemple. Merci pour l'info. AVEC (VERROU) est nécessaire parce que nous sommes confrontés à des blocages (Page verrous de Niveau) pendant la charge massive (des dizaines et des insertions/mises à jour/sélectionne pour chaque seconde sur la même table). Je suis conscients de ses avantages et des pièces de monnaie (l'escalade de verrous etc).
Pouvez-vous enlever les deux
WITH (NOLOCK)
dans le CCE? Je pense que peut être la source de conflits.Je suis d'accord que la suppression de la (nolock) énoncés dans le select est le chemin à parcourir. Avec des index en place de l'instruction select doit être v. rapide - qu'est-ce que le plan d'exécution que vous avez vu et vous avez un index sur la table table1 sur col3, id, col2?
Merci pour la réponse. Oui - si je supprime (NOLOCK) il s'exécute sans erreur. Mais je veux profiter des avantages de la non-verrouillé "choisir les x lignes et de bénéficier également de" seule la ligne verrouillé " mise à jour. J'accepte le risque de "sale lit", je ne peux pas attendre jusqu'à ce que tous les verrous de terminer lors de la sélection de x lignes, c'est pourquoi j'ai besoin (NOLOCK). Et je veux donner un indice sur la mise à jour, de faire des verrous de ligne, car la page/table des verrous de provoquer une situation de blocage. (c'est pourquoi j'utilise AVEC (VERROU))
OriginalL'auteur Barney | 2014-11-27
Vous devez vous connecter pour publier un commentaire.
NOLOCK
ne s'applique pas à la partie de la requête qui fait référence à la table à modifier. Dans SQL Server update U-lock chaque ligne brièvement alors qu'il est en train d'être testé. C'est un blocage de l'évitement de mécanisme. Il empêche plusieurs mises à jour à chaque S-lock une ligne pour lire et puis essayer de X-lock.Vous ne pouvez pas faire de l'U-serrures aller autant que je sache. Mais vous pouvez réduire la quantité de lignes de U-verrouillé à la abolute minimum par soi rejoindre:
Ce qui ajoute un peu de surcharge, mais il vous permet d'utiliser
NOLOCK
pour la lecture.Envisager l'utilisation de l'isolement d'instantané pour le lit.
NOLOCK
a certains problèmes, tels que des requêtes au hasard d'avorter.OriginalL'auteur usr