tag rowlock ejemplo attribute sql sql-server

sql - ejemplo - ¿Cuál es el propósito de ROWLOCK en Eliminar y cuándo debo usarlo?



title html attribute (2)

Ex)

¿Cuándo debo usar esta declaración?

DELETE TOP (@count) FROM ProductInfo WITH (ROWLOCK) WHERE ProductId = @productId_for_del;

Y cuando debería estar haciendo:

DELETE TOP (@count) FROM ProductInfo WHERE ProductId = @productId_for_del;


Rowlock es una sugerencia de consulta que se debe usar con precaución (al igual que todas las sugerencias de consulta).

Omitirlo probablemente resultará en el mismo comportamiento exacto y siempre que no garantice que solo usará un bloqueo de fila, es solo una sugerencia después de todo. Si no tiene un conocimiento muy profundo de la contención de bloqueos, es probable que el optimizador elija la mejor estrategia de bloqueo posible, y estas cosas suelen dejarse en manos del motor de la base de datos para decidir.

ROWLOCK significa que SQL bloqueará solo la fila afectada, y no toda la tabla o la página en la tabla donde se almacenan los datos al realizar la eliminación. Esto solo afectará a otras personas que lean de la tabla al mismo tiempo que se ejecuta la eliminación.

Si se usa un bloqueo de tabla, todas las consultas a la tabla esperarán hasta que se complete su eliminación, con un bloqueo de fila solo se seleccionará la lectura de las filas específicas y se hará esperar.

Eliminar la N superior donde N es un número de filas probablemente bloqueará la tabla en cualquier caso.


with (rowlock) es una sugerencia que indica a la base de datos que debe mantener los bloqueos en un ámbito de fila. Eso significa que la base de datos evitará escalar los bloqueos para bloquear o el alcance de la tabla.

Utiliza la sugerencia cuando solo una o solo unas pocas filas se verán afectadas por la consulta, para evitar que el bloqueo bloquee las filas que no serán eliminadas por la consulta. Eso permitirá que otra consulta lea filas no relacionadas al mismo tiempo en lugar de tener que esperar a que se complete la eliminación.

Si lo usa en una consulta que eliminará muchas filas, puede degradar el rendimiento, ya que la base de datos intentará evitar escalar los bloqueos a un alcance mayor, incluso si hubiera sido más eficiente.

Normalmente, no debería necesitar agregar tales sugerencias a una consulta, porque la base de datos sabe qué tipo de bloqueo usar. Es solo en situaciones en las que tiene problemas de rendimiento porque la base de datos tomó una decisión incorrecta, por lo que debería agregar tales sugerencias a una consulta.