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
Du point de vue syntaxique que la déclaration est valable, mais deux défis sont: vous n'avez pas obtenu un jugement par déclaration ne sais pas quelles lignes vous allez réellement à mettre à jour; et le verrou est juste une allusion à l'optimiseur peut être utilisé ou ne peuvent pas être utilisés. Pourquoi avez-vous besoin d'un verrou de toute façon?
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