Alors que des recherches sur l'utilisation des indicateurs de Table, je suis tombé sur ces deux questions:
Les réponses à ces deux questions, dire que lors de l'utilisation d' (UPDLOCK, HOLDLOCK)
, les 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
Ai-je mal comprendre 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?
De plus amples explications 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 est clairement dit qu' (UPDLOCK, HOLDLOCK)
bloquera lit (pas ce que je veux). Les commentaires sur cette réponse implique 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 qu' (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.