56 votes

SQL Server - Comment verrouiller une table jusqu'à la fin d'une procédure stockée ?

Je veux le faire :

create procedure A as
  lock table a
  -- do some stuff unrelated to a to prepare to update a
  -- update a
  unlock table a
  return table b

Une telle chose est-elle possible ?

En fin de compte, je veux que mon rapport SQL Server Reporting Services appelle la procédure A, puis n'affiche la table a qu'une fois la procédure terminée. (Je ne suis pas en mesure de modifier la procédure A pour qu'elle renvoie la table a).

0 votes

Avez-vous envisagé d'utiliser SET TRANSACTION / COMMIT . Je ne suis pas trop sûr de ce que vous essayez d'obtenir ici ?

0 votes

La réponse de Xin était beaucoup plus concise et moins gourmande en ressources. J'ai cependant dû utiliser TABLOCKX.

59voto

Graham Points 694

J'avais besoin de cette réponse moi-même et de la lien fourni par David Moye J'ai décidé de rédiger ce document et j'ai pensé qu'il pourrait être utile à d'autres personnes qui se posent la même question :

CREATE PROCEDURE ...
AS
BEGIN
  BEGIN TRANSACTION

  -- lock table "a" till end of transaction
  SELECT ...
  FROM a
  WITH (TABLOCK, HOLDLOCK)
  WHERE ...

  -- do some other stuff (including inserting/updating table "a")

  -- release lock
  COMMIT TRANSACTION
END

1 votes

Ne peut-on pas utiliser sp_getapplock pour cela ?

2 votes

À partir de la documentation ( msdn.microsoft.com/fr/us/library/ms189823.aspx ), il semble que sp_getapplock fera également le travail, sp_releaseapplock étant utilisé pour libérer le verrou. Il a également l'avantage de ne pas avoir besoin d'être à l'intérieur d'une transaction, à ce qu'il semble.

18 votes

TABLOCK empêchera les mises à jour par d'autres sessions, TABLOCKX empêchera à la fois les mises à jour et les lectures.

24voto

Xin Points 5528
BEGIN TRANSACTION

select top 1 *
from table1
with (tablock, holdlock)

-- You do lots of things here

COMMIT

Cela maintiendra le "verrou de table" jusqu'à la fin de votre "transaction" actuelle.

17voto

David Moye Points 675

Utilisez l'indice de verrouillage TABLOCKX pour votre transaction. Voir cet article pour plus d'informations sur le verrouillage.

0 votes

Vous pouvez également utiliser UPDLOCK si vous êtes d'accord pour que d'autres personnes lisent la table pendant que vous l'utilisez.

0 votes

Où intervient la transaction ? Dois-je envelopper tout mon PS dans une transaction ?

0 votes

Pour beaucoup de PS, il est logique de commencer une transaction au début et de la valider à la fin. Il y a, bien sûr, des exceptions à cette règle, mais en général, je trouve que c'est une bonne pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X