Confus au sujet de UPDLOCK, HOLDLOCK

Alors que des recherches sur l'utilisation de Les Indicateurs De Table, je suis tombé sur ces deux questions:

Réponses à ces deux questions, dire que lors de l'utilisation de (UPDLOCK, HOLDLOCK), d'autres processus ne sera pas en mesure de lire des données sur cette table, mais je n'ai pas vu cela. Pour tester, j'ai créé une table et a commencé à deux SSMS windows. À partir de la première fenêtre, j'ai couru une opération qui sélectionnée à partir de la table à l'aide de divers indicateurs de table. Alors que l'opération était en cours d'exécution, à partir de la deuxième fenêtre, j'ai couru diverses déclarations à voir ce qui serait bloqué.

La table de test:

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

De SSMS Fenêtre 1:

BEGIN TRANSACTION

SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'

COMMIT TRANSACTION

De SSMS Fenêtre 2 (couru l'un des éléments suivants):

SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'

Effet de différents indicateurs de table sur l'exécution des instructions dans la Fenêtre 2:

           (UPDLOCK)       (HOLDLOCK)    (UPDLOCK, HOLDLOCK)    (TABLOCKX)
---------------------------------------------------------------------------
SELECT    not blocked      not blocked       not blocked         blocked
INSERT    not blocked        blocked           blocked           blocked
UPDATE      blocked          blocked           blocked           blocked
DELETE      blocked          blocked           blocked           blocked

Fait que j'ai mal compris les réponses apportées à ces questions, ou faire une erreur dans mes tests? Si non, pourquoi voudriez-vous utiliser (UPDLOCK, HOLDLOCK) vs (HOLDLOCK) seul?


Explication supplémentaire de ce que je suis en train de réaliser:

Je voudrais sélectionner des lignes d'une table et d'empêcher que les données dans la table modifiée alors que je suis en traitement. Je ne suis pas la modification des données, et à autoriser les lectures se produire.

Cette réponse dit clairement que (UPDLOCK, HOLDLOCK) va bloquer lit (pas ce que je veux). Les commentaires sur cette réponse entendre qu'il est HOLDLOCK qui empêche lit. Pour essayer de mieux comprendre les effets de la table de conseils et de voir si UPDLOCK à elle seule faire ce que je voulais, j'ai fait l'expérience ci-dessus et obtenu des résultats qui contredisent ces réponses.

Actuellement, je crois que (HOLDLOCK) est ce que je devrais utiliser, mais je suis préoccupé de ce que j'ai peut-être fait une erreur ou oublié quelque chose qui va revenir à la mords-moi dans l'avenir, d'où cette question.

InformationsquelleAutor Jeff Ogata | 2011-10-21