Durante la ricerca sull'uso dei suggerimenti per la tabella , mi sono imbattuto in queste due domande:
Le risposte a entrambe le domande dicono che durante l'utilizzo (UPDLOCK, HOLDLOCK)
, altri processi non saranno in grado di leggere i dati su quella tabella, ma non l'ho visto. Per testare, ho creato una tabella e avviato due finestre SSMS. Dalla prima finestra, ho eseguito una transazione selezionata dalla tabella utilizzando vari suggerimenti di tabella. Mentre la transazione era in esecuzione, dalla seconda finestra ho eseguito varie istruzioni per vedere quale sarebbe stata bloccata.
La tabella dei 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]
Dalla finestra SSMS 1:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
Dalla finestra SSMS 2 (eseguito uno dei seguenti):
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'
Effetto di diversi suggerimenti di tabella sulle istruzioni eseguite nella finestra 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
Ho frainteso le risposte fornite in quelle domande o ho commesso un errore durante il test? In caso contrario, perché dovresti usare (UPDLOCK, HOLDLOCK)
vs. (HOLDLOCK)
da solo?
Ulteriore spiegazione di ciò che sto cercando di realizzare:
Vorrei selezionare le righe da una tabella e impedire che i dati in quella tabella vengano modificati durante l'elaborazione. Non sto modificando quei dati e vorrei consentire le letture.
Questa risposta dice chiaramente che (UPDLOCK, HOLDLOCK)
bloccherà le letture (non quello che voglio). I commenti su questa risposta implicano che è HOLDLOCK
quello che impedisce le letture. Per cercare di capire meglio gli effetti dei suggerimenti della tabella e vedere se UPDLOCK
da solo avrebbe fatto quello che volevo, ho fatto l'esperimento sopra e ho ottenuto risultati che contraddicono quelle risposte.
Attualmente, credo che (HOLDLOCK)
sia quello che dovrei usare, ma temo di aver commesso un errore o di aver trascurato qualcosa che tornerà a mordermi in futuro, da qui questa domanda.