En cuanto al rendimiento, sigue centrándose en la selección.
Compartido no bloquea lecturas.
Actualización de bloques de bloqueo compartidos.
Si tiene cientos de bloqueos compartidos, llevará una actualización un tiempo obtener un bloqueo exclusivo, ya que debe esperar a que los bloqueos compartidos se eliminen.
Por defecto, seleccionar (leer) toma un bloqueo compartido.
Los bloqueos compartidos (S) permiten que las transacciones simultáneas lean (SELECCIONE) un recurso.
Un bloqueo compartido como ningún efecto en otros selecciona (1 o un 1000).
La diferencia es cómo se actualiza o inserta la función nolock frente a los efectos de bloqueo compartido.
Ninguna otra transacción puede modificar los datos mientras existen bloqueos compartidos (S) en el recurso.
¡Un bloqueo compartido bloquea una actualización!
Pero nolock no bloquea una actualización.
Esto puede tener un gran impacto en el rendimiento de las actualizaciones. También impacta insertos.
Dirty read (nolock) suena sucio. Nunca obtendrás datos parciales. Si una actualización cambia a John a Sally, nunca lo conseguirás.
Uso mucho los bloqueos compartidos para concurrencia. Los datos están desactualizados tan pronto como se leen. Una lectura de John que cambia a Sally en el siguiente milisegundo es información obsoleta. Una lectura de Sally que se revierte John en el siguiente milisegundo son datos obsoletos. Eso es en el nivel de milisegundo. Tengo un cargador de datos que demora 20 horas para ejecutarse si los usuarios toman bloqueos compartidos y 4 horas para ejecutarlo, ya que los usuarios no tienen bloqueo. Los bloqueos compartidos en este caso hacen que los datos estén atascados 16 horas.
No use nolocks mal. Pero ellos tienen un lugar. Si va a cortar un cheque cuando un byte se establece en 1 y luego lo establece en 2 cuando se corta el cheque, no es un momento para un nolock.
¡Buena respuesta, muchas gracias! ¿Habría un impacto (en cientos de consultas 'SELECT') para usar' WITH (NOLOCK) 'sin razón? –
Usamos con nolock en el 99.5% de nuestras selecciones, no es broma. Si un administrador está actualizando un registro de usuario, no desea que el informe se quede allí y espere a que termine toda la transacción distribuida. Entonces, sus datos antiguos aparecen en el informe. ¿A quien le importa? Si el informe se ejecutó un segundo antes, es la misma información que habría estado allí con rowlock. El único lugar que le preocupa es la información que aún no está comprometida. Si muestra "pedidos en la última hora", eso podría ser un problema, pero un pequeño problema en comparación con las ganancias de velocidad/concurrencia. –
También desde que se lanzó un 'informe' como ejemplo, los informes son típicamente por un período de tiempo que no son los últimos 5 minutos. Informes de datos del mes pasado con nolock: bueno, no es como si los datos se revertieran un mes después. –