Tiene un gran impacto.
El bloqueo de actualización toma un bloqueo de actualización en la fila, actualización de intención en la página y un bloqueo compartido en la tabla/base de datos.
Esto no impide que otras consultas accedan a los datos dentro de la tabla, ya que los bloqueos en la página/base de datos son meramente bloqueos compartidos. Simplemente no pueden chocar bloqueos contra la fila/página/tabla individual al intentar realizar una operación que podría contradecir los bloqueos. Si eso ocurría, la solicitud se pondría detrás de las cerraduras actuales y esperaría a que estuviera disponible antes de que pudiera continuar.
Al usar holdlock, la consulta está siendo forzada a ser serializada, bloqueando la tabla exclusivamente hasta que se complete la acción. Esto evita que alguien lea la tabla a menos que se use la pista nolock, permitiendo una lectura potencialmente sucia.
Para ver el efecto, genere una tabla de ejemplo 'foo' y coloque algunos datos de basura en ella.
begin tran
select * from foo with (updlock)
where tableid = 1
-- notice there is no commit tran
abrir otra ventana y tratar:
select * from foo
Las filas regresan, ahora confirman la transacción búsqueda original. Vuelva a ejecutar es alterado para usar holdlock así:
begin tran
select * from foo with (updlock, holdlock)
where tableid = 1
volver a la otra ventana y tratar de seleccionar los datos de nuevo, la consulta no devolver valores, ya que está bloqueado por el bloqueo exclusivo. Confirme la transacción en la primera ventana y los resultados en la segunda consulta aparecerán porque ya no está bloqueada.
La prueba final es utilizar el nolock, ejecute la transacción de nuevo utilizando updlock y holdlock. a continuación, ejecute el siguiente en la segunda ventana:
select * from foo (nolock)
Los resultados van a volver de forma automática, ya que han aceptado el riesgo de una lectura sucia (lectura no confirmada).
Por lo tanto, se considera que tiene un gran impacto, ya que obliga a serializar las acciones contra esa tabla que podrían ser lo que desea (dependiendo de la actualización) o creará un cuello de botella muy grande en esa tabla . Si todos hicieran eso en una mesa ocupada con transacciones de larga ejecución, entonces causaría demoras significativas dentro de una aplicación.
Al igual que con todas las funciones de SQL, cuando se usan correctamente pueden ser potentes, pero el uso incorrecto de una característica/sugerencia puede causar problemas importantes. Prefiero usar consejos como último recurso para cuando tengo que anular el motor, no como un enfoque predeterminado.
Editar como solicitado: Probado en SQL 2005, 2008, 2008R2 (All Enterprise): todos instalados en configuraciones predeterminadas, base de datos de prueba creada utilizando todos los valores predeterminados (solo ingresó el nombre del DB solamente).
buena respuesta, gracias – marijne
buena explicación, eso ayuda mucho! – Mercurybullet
@Darren: he retrocedido la edición que ha realizado, ningún bloqueo no es el predeterminado y el segundo no debe tomar un bloqueo de actualización. – Andrew