Mientras investigaba el uso de Table Hints , me encontré con estas dos preguntas:
Las respuestas a ambas preguntas dicen que cuando se usan (UPDLOCK, HOLDLOCK)
, otros procesos no podrán leer datos en esa tabla, pero yo no vi esto. Para probar, creé una tabla e inicié dos ventanas SSMS. Desde la primera ventana, ejecuté una transacción que seleccionó de la tabla usando varias sugerencias de tabla. Mientras se ejecutaba la transacción, desde la segunda ventana ejecuté varias declaraciones para ver cuál se bloquearía.
La mesa de prueba:
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]
Desde la ventana 1 de SSMS:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
Desde la ventana 2 de SSMS (ejecutó uno de los siguientes):
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'
Efecto de diferentes sugerencias de tabla en declaraciones ejecutadas en la Ventana 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
¿Entendí mal las respuestas dadas en esas preguntas o cometí un error en mis pruebas? Si no es así, ¿por qué usarías (UPDLOCK, HOLDLOCK)
o (HOLDLOCK)
solo?
Más explicación de lo que estoy tratando de lograr:
Me gustaría seleccionar filas de una tabla y evitar que los datos de esa tabla se modifiquen mientras los estoy procesando. No estoy modificando esos datos y me gustaría permitir que se realicen lecturas.
Esta respuesta dice claramente que (UPDLOCK, HOLDLOCK)
bloqueará las lecturas (no lo que quiero). Los comentarios sobre esta respuesta implican que es lo HOLDLOCK
que impide las lecturas. Para intentar comprender mejor los efectos de las sugerencias de la tabla y ver si UPDLOCK
solo haría lo que quería, hice el experimento anterior y obtuve resultados que contradicen esas respuestas.
Actualmente, creo que eso (HOLDLOCK)
es lo que debería usar, pero me preocupa haber cometido un error o haber pasado por alto algo que volverá a morderme en el futuro, de ahí esta pregunta.
fuente
UPDLOCK se usa cuando desea bloquear una fila o filas durante una instrucción de selección para una declaración de actualización futura. La futura actualización podría ser la siguiente declaración de la transacción.
Otras sesiones aún pueden ver los datos. Simplemente no pueden obtener bloqueos que sean incompatibles con UPDLOCK y / o HOLDLOCK.
Utiliza UPDLOCK cuando desea evitar que otras sesiones cambien las filas que ha bloqueado. Restringe su capacidad para actualizar o eliminar filas bloqueadas.
Utiliza HOLDLOCK cuando desea evitar que otras sesiones cambien los datos que está viendo. Restringe su capacidad para insertar, actualizar o eliminar las filas que ha bloqueado. Esto le permite ejecutar la consulta nuevamente y ver los mismos resultados.
fuente
(UPDLOCK,HOLDLOCK)
bloque lee, y hay una razón para usar en(UPDLOCK,HOLDLOCK)
lugar de solo(HOLDLOCK)
?