Expresión de pregunta:

Estoy probando algunas cosas con respecto a las transacciones. Considere las siguientes operaciones:

  1. Abra una ventana de conexión 1 en SQL Server Management Studio
  2. BEGIN una transacción, luego borre alrededor de 2000 filas de datos de la tabla A
  3. Abra otra ventana de conexión 2 en SQL Server Management Studio
  4. Inserte una nueva fila de datos en la tabla A en la ventana 2 (sin transacción), se ejecuta correctamente en este momento

Luego, repito la misma operación, pero en el PASO 2 elimino 10k filas de datos, en ese caso, el PASO 4 no se puede ejecutar correctamente. Ya había esperado media hora.

Muestra que está ejecutando SQL ... no puede terminar. Finalmente, inserto los datos usando la ventana de conexión 1, funciona ahora mismo.

¿Por qué funciona con 2k filas pero no 10k filas?


La sentencia Sql que ejecuto:

En las ventanas de conexión A, ejecuto BEGIN TRAN Delete from tableA (10K filas)

En las ventanas de conexión B, ejecuto Insertar en la tabla (..) VALORES (...)

Windows B no se puede ejecutar correctamente.


Muchas gracias @Gordon

La causa :

Busco la palabra clave sobre escalada de bloqueo. Intento rastrear la escalada de bloqueo usando SQL Server Profiler, y obtengo un bloqueo: escalada cuando elimino muchos datos en una transacción (no confirmo ni retrocedo).

Entonces, conozco el concepto de escalada de bloqueo. Elimino demasiados datos en una tabla, luego la fila bloquea la escalada a la escalada de la tabla. No los comprometí ni los revertí, otra conexión (o aplicación) no puede acceder a la mesa con candado de mesa. escalada de bloqueo de seguimiento en sql profiler


Cuando ocurre la escalada de bloqueo en MSSQL Server

"La opción de bloqueos también afecta cuando se produce la escalada de bloqueos. Cuando los bloqueos se establecen en 0, la escalada de bloqueos se produce cuando la memoria utilizada por las estructuras de bloqueo actuales alcanza el 40 por ciento del grupo de memoria del Motor de base de datos. Cuando los bloqueos no se establecen en 0, la escalada de bloqueos ocurre cuando el número de bloqueos alcanza el 40 por ciento del valor especificado para los bloqueos ".


Cómo configurar con SQL Server Management Studio que afectará la escalada de bloqueo:

Para configurar la opción de bloqueos En el Explorador de objetos, haga clic con el botón derecho en un servidor y seleccione Propiedades.

Haga clic en el nodo Avanzado.

En Paralelismo, escriba el valor deseado para la opción de bloqueos.

Utilice la opción de bloqueos para establecer el número máximo de bloqueos disponibles, limitando la cantidad de memoria que SQL Server utiliza para ellos.

0
Yahui Liu 5 oct. 2019 a las 20:23

1 respuesta

La mejor respuesta

Lo que está experimentando es "escalada de bloqueo". De forma predeterminada, SQL Server usa (creo) bloqueos de nivel de fila para la eliminación. Sin embargo, si una expresión tiene más de un umbral (5000 bloqueos), SQL Server escala el bloqueo a toda la tabla.

Este es un mecanismo automático, que puede apagar si lo necesita.

Hay mucha información sobre esto, tanto en documentos de SQL Server como en documentos relacionados.

3
Gordon Linoff 5 oct. 2019 a las 17:28