Vérouillage d'une table

Ulun - 17 janv. 2013 à 09:01
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 - 31 janv. 2013 à 17:22
Bonjour,
Je voulais savoir si il éxiste un moyen, ou une requête qui permettrait de vérouiller une table.
Mon but étant de la rendre innaccesible en Lecture et en écriture.
Je suis sour SQL Server Management Studio express.

Merci d'avance

5 réponses

cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
17 janv. 2013 à 21:33
Tu peux faire comme ca :

BEGIN TRAN;
  SELECT 0 FROM [Table] WITH(TABLOCK,HOLDLOCK,XLOCK);

  --Ton travail

COMMIT TRAN;


un variante si jamais tu veux évité la pollution du SELECT dans les résultats.

DECLARE @Void TABLE (void int);
BEGIN TRAN;
  INSERT INTO @Void SELECT DISTINCT 0 FROM [Table] WITH(TABLOCK,HOLDLOCK,XLOCK);

  --Ton travail

COMMIT TRAN;


si tu veux une meilleurs granularité :

DECLARE @Void TABLE (void int);
BEGIN TRAN;
  INSERT INTO @Void SELECT DISTINCT 0 FROM [Table1] WITH(ROWLOCK,HOLDLOCK,XLOCK) WHERE ID = @ID;
  INSERT INTO @Void SELECT DISTINCT 0 FROM [Table2] WITH(ROWLOCK,HOLDLOCK,XLOCK) WHERE ID_Table_1 = @ID;

  --Ton travail

COMMIT TRAN;


pour un vérouillage de l'écriture uniquement :

DECLARE @Void TABLE (void int);
BEGIN TRAN;
  INSERT INTO @Void SELECT DISTINCT 0 FROM [Table] WITH(TABLOCK,HOLDLOCK,UPDLOCK);

  --Ton travail

COMMIT TRAN;


ETC, tout réside donc dans le WITH (...) regarde la MSDN sur les Table Hints pour voir les différentes possibilité.
Attention, si tu utilise cette technique a plusieurs encdroits veille bien a locké les table toujours dans le même ordre pour évité les deadlocks autant que possible.
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
17 janv. 2013 à 21:44
ca me donne l'idée d'un tuto sur cette technique tiens!
0
Bonjour,
Mecri Malkuth pour ta réponse et désolé d'avoir mis autant de temps à répondre ^^
La commande est bien passée ("Commande réussie"), je vais donc de ce pas voir si ça à eût l'effet escompté. ^

En attendant, pour faire l'étape inverse
0
Bon et bien ça ne marche pas.
Est ce que tu pourrais m'expliquer ce que fait chaque Requête ?
Afin que je comprenne un peu mieux le but et l'effet. Comme ça je pourrai choisir laquelle correspond le mieux à mon cas.

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
31 janv. 2013 à 17:22
Quelques explications :

DECLARE @Void TABLE (void int);
Déclaration d'une table temporaire, utilisé par la suite pour masqué certains résultats non attendu.

BEGIN TRAN;
Démarrage d'une transaction, ceci définie la porter du verrouillage que nous allons effectuer.

INSERT INTO @Void SELECT DISTINCT 0 FROM [Table] WITH(TABLOCK,HOLDLOCK,XLOCK);
Verrouillage de la table [Table], TABLOCK définie un verrouillage de la table,XLOCK indique un verrouillage exclusif(lecture écriture), HOLDLOCK spécifie de conservé se verrouillage jusqu’à la fin de la transaction.

--Ton travail
Ici, tu dois insérer le code SQL qui nécessite le verrouillage de la table

COMMIT TRAN;
Mets fin à la transaction et au verrouillage de la table.

N'hésite pas à partager ton code que je puisse me faire une idée plus juste, et mieux comprendre ce qui pose problème.
0
Rejoignez-nous