2017-09-22 1 views
0

Deux procédures sont en cours d'exécution dans différents travaux de l'Agent SQL Server. Les deux mettent à jour la même table. Maintenant, je reçois une erreur de blocage.Verrouillage de mode U dans SQL Server

La table possède également un déclencheur pour mettre à jour une table d'historique.

Lorsque j'ai vérifié le rapport de blocage XML, il affiche les informations suivantes:

<owner-list> 
    <owner mode="U" /> 
</owner-list> 
<waiter-list> 
    <waiter mode="U" requestType="wait" /> 
</waiter-list> 

Essayer de comprendre ce que la question est. La question est intermittente.

+0

'serrures U' sont des verrous de mise à jour ** ** - qui n'est pas très surprenant, voir Vos deux emplois mettent à jour la table en question. Il semblerait donc qu'un processus met à jour une ligne que l'autre processus essaie de mettre à jour en même temps –

Répondre

0

Vous devrez peut-être partager votre code de procédure stockée pour que nous puissions vous aider. Le code XML seul n'est pas suffisant. Cela dit, enveloppez-vous le code dans une transaction? Et puis verrouiller la table?

Comme ceci:

BEGIN TRANSACTION 

SELECT * 
FROM tblYourTable 
WITH (TABLOCK, HOLDLOCK) -- lock the table until the end of the transaction 

-- Continue other queries with the table (Updating, Inserting, etc.) 

COMMIT TRANSACTION -- release the lock (and transaction) after you are done with all of your processing. 

Vous pouvez également utiliser un rollback si les choses tournent mal.

Cependant, pour répondre à votre question sur les verrous U, voici un bon résumé de la façon dont les verrous fonctionnent dans SQL Server: Lock Types