2008-11-26 8 views
5

Tengo un interbloqueo divertido provocado por una simple consulta SQL ACTUALIZACIÓN simple, en una tabla plana simple, en la transacción predeterminada "LEER COMPROMETIDO".Reduce el interbloqueo en el nivel de PAGE en la consulta de actualización en MS SQL

UPDATE tabla SET columna = @ P1 WHERE PK = @ P2; Mientras PK varchar (11) tiene un índice agrupado. sin disparador o relación de mesa ... etc en la mesa.

Revisé y encontré que el interbloqueo ocurre en el nivel "PAGE", no en el nivel de ROW/grabación. Luego, me parece que para cada consulta de actualización, toma 100 (y más) bloqueos PAGE. (No tiene sentido para mí porque estoy actualizando una fila a la vez)

¿Hay alguna manera de evitar que se produzca un estancamiento? O bien, ¿cómo se puede reducir el número de bloqueos necesarios para una única actualización de fila sin usar el cursor?

-

Gracias por su sugerencia.

He intentado reconstruir el índice varias veces, con factor de relleno alto y bajo. Intenté hacer que los procesos actualizaran diferentes posiciones/sectores. Pero nada mejoró o empeoró.

-

Probé el SQL Server Profiler. Capté algunos "Lock: Deadlock Chain" y "Lock: Deadlock", pero no se capturó "Deadlock Graph". Ambos lados están haciendo la consulta de actualización simple en modo de confirmación de lectura, autocompromiso.

Lock:Deadlock Chain 17887475 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887476 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102                                                               265006271  0 0X56AF060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887477 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887478 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206                                                               265006240  0 0XDE80060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887479 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206                                                               265006271  0 0XDE80060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887480 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887481 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066                                                               265006240  0 0X5280060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887482 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066                                                               265006271  0 0X5280060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887483 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887484 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614                                                               265006271  0 0X8E7E060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887485 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887486 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687                                                               265006271  0 0XBF82060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887487 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887488 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392                                                               265006271  0 0XB07D060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887489 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887491 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887493 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887494 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792                                                               265006271  0 0X50A6060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887495 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887496 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206                                                               265006271  0 0XBEAF060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock 17887497  myuser 0XCD85FBB269700B4AA2F4E8579D118999 209 myserver myuser 2008-11-28 10:16:45.930 1:426206 265006271 myapps 0 0XDE80060001000000000000001B0006 123 27 281 2008-11-28 10:16:46.210 myclient 0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971498     

Respuesta

0

Finalmente tengo que hacer una solución mediante el uso de cusror en un procedimiento almacenado.

Pero sigue siendo interesante cómo se produce el bloqueo de PÁGINA y cómo resolverlo.


Después de algún búsqueda más en Google, hay algunas otras personas tienen el mismo problema y ellos (de foro de MSDN) sugieren que apagar el paralelismo en SQL Server 2005 pero nunca tienen la oportunidad de probar.

3

usted tiene 2 opciones para reducir la extensión de bloqueo:

1) añadir el CON (ROWLOCK) sugerencia de pedir SQL Server para tomar las cerraduras granularidad más fina (su experiencia puede variar:

UPDATE tabla CON (ROWLOCK) Conjunto columna = @ P1 DONDE PK = @ P2;.. Mientras PK varchar (11), tiene un índice agrupado en que no tigger o mesa relation..etc sobre la mesa

2) actualizan las filas en orden aleatorio, lo que reduce la probabilidad de que los bloqueos de fila se escalen a bloqueos de página.

Además, asegurarse de que los índices en esa tabla estén actualizados a menudo puede reducir el bloqueo. Como puede dejar un factor de relleno (90 es bueno) si va a hacer muchas inserciones.

0

En el caso normal y simple, este tipo de comportamiento no se ve a menudo. Mi pregunta para usted es esta: ¿qué hay del "otro lado" de esta transacción? ¿Cuál es la otra declaración de actualización que se está ejecutando y está causando este punto muerto? Esa, creo, será la clave para diagnosticar este problema. Honestamente, mi dinero está en esta otra, hasta ahora la culpa es la consulta no identificada. Y estoy en Vegas ahora ...

+0

Esa es la parte más extraña, la otra parte hace exactamente la misma consulta, con completa otra clave principal. –

+0

Y incluso me desconecto/vuelvo a conectar para asegurar que no haya ningún bloqueo/transacción oculta. –

1

¿Has ejecutado un rastro de perfil?

fuego hasta el Analizador de SQL y crear un rastro de serie con estos eventos ha añadido:

  • Cerraduras: Deadlock Graph
  • Cerraduras: Lock: Deadlock Chain
  • Cerraduras: Lock: Escalation

Debería proporcionar detalles de la naturaleza precisa del punto muerto.

0

¿Qué declaraciones de selección de la misma tabla Y se producen los mismos registros dentro de la misma transacción antes de la declaración de actualización? Use (updlock) consejos de bloqueo en estas selecciones.

+0

Nada (después de reconectar) u otra consulta SELECCIONAR simple por el Pk. He tratado de agregar "con (updlock)" antes, mantiene el bloqueo de actualización "fila", pero no puede reducir el bloqueo de "página" en la consulta de actualización. –

0

¿Tiene algún ACTUALIZADOR DE ACTUALIZACIÓN sobre la mesa? Si es así, la acción del disparador puede estar causando el punto muerto.

+0

No. Es una tabla simple. Sin clave foránea Sin disparador –

Cuestiones relacionadas