2009-05-30 43 views
5

He leído este problema de bloqueo muerto Cuando las tablas de la base de datos comienzan a acumular miles de filas y muchos usuarios comienzan a trabajar simultáneamente en la misma tabla, las consultas SELECT en las tablas comienzan a generar contenciones de bloqueos y bloqueos de transacción.cómo resolver el problema de interbloqueo?

¿Este problema de interbloqueo está relacionado con TransactNo updlock? Si conoce este problema, avíseme por favor. Gracias de antemano.

Respuesta

3

No ha proporcionado suficiente información para responder su pregunta directamente.

Pero la mayoría de los bloqueos y bloqueos se pueden reducir (o incluso eliminar) teniendo los índices "correctos" para cubrir la carga de trabajo de su consulta.

¿Debido a que tiene un trabajo de mantenimiento de índice regular programado?

Si tiene SELECT s que no necesitan ser fiable al 100% (es decir, permitir que las lecturas sucias, etc.) entonces se puede ejecutar algunos SELECTS con WITH(NOLOCK), lo que es lo mismo que un nivel de aislamiento de LEER uncommited. Tenga en cuenta: No estoy sugiriendo que coloque WITH(NOLOCK) en todas partes; solo en aquellos SELECCIONADOS que no necesitan datos 100% intactos.

4

Un punto muerto puede ocurrir por muchas razones por lo que tendrías que hacer un poco de tarea primero si quieres que te ayudemos y decirnos qué está causando el punto muerto, es decir. ¿Cuáles son los lotes implicados en la ejecución del punto muerto, qué recursos están involucrados y demás? El Profiler deadlock event graph es siempre un gran lugar para comenzar la investigación. Si me aventurara a oscurecerme, lo que ocurre es que sus consultas e índices no están ajustados correctamente, por lo que la mayoría de sus operaciones de lectura (y quizás algunas de las escrituras) son escaneos de tabla completa y se garantiza que colisionarán con actualizaciones Esto puede causar deadlocks by order of index access, interbloqueo por orden de operaciones, interbloqueo por escalamiento y así sucesivamente.

Una vez que identifica la causa del punto muerto, se puede tomar la acción adecuada para eliminarlo. Los casos en los que la acción adecuada es recurrir a lecturas sucias son extremadamente raros.

BTW No estoy seguro de lo que quiere decir con 'TransactNo updlock'. ¿Está preguntando específicamente sobre el S-U/U-S asymmetry of the U locks?

4

Un problema común con alto aislamiento es extensión de bloqueo puntos muertos debido al el siguiente escenario; es decir(Donde X es cualquier recurso, como una fila)

  • SPID una lee X - obtiene un bloqueo de lectura
  • SPID b lee X - consigue un bloqueo de lectura
  • SPID un intento para actualizar X - bloqueados b por bloqueo a leer, por lo que tiene que esperar
  • SPID b intentos para actualizar X - bloqueado por una cerradura a leer, por lo que tiene que esperar

punto muerto! Este escenario se puede evitar tomando más cerraduras:

  • SPID A lee X con (UPDLOCK) especificada - obtiene un bloqueo exclusivo
  • SPID B intenta lee X - bloqueado por un Es bloqueo exclusivo, por lo que tiene que esperar
  • SPID un intento para actualizar X - bien
  • ... (SPID a/rollos de devolución las confirmaciones, y libera el bloqueo en algún momento)
  • ... (SPID B hace lo que quería hacer)
+0

La escalada de bloqueo se produce cuando un motor decide dejar de tomar bloqueos granulares individuales y decide obtener un bloqueo grueso de mayor nivel. La escalada de bloqueo va desde bloqueos a nivel de fila hasta bloqueos a nivel de tabla. Un signo de cuento de un punto muerto de escalamiento de bloqueo es la participación de I bloqueos (bloqueos intencionales) a medida que la escalada trata de obtener bloqueos reales en la tabla y entrará en conflicto con los varios bloqueos de intento (S-IX, S-IS) ya colocados en él . Su ejemplo es la lectura canónica seguida del caso de escritura, no está relacionado con la escalada. –

+0

Si utilicé la terminología incorrecta, me disculpo; pero el escenario (con cualquier nombre) es un problema común. –

3

voy a tirar mis propios artículos y entradas en la mezcla sobre los puntos muertos:

http://sqlblog.com/blogs/jonathan_kehayias/archive/tags/Deadlock/default.aspx

que también tienen una serie de videos en la resolución de problemas en deadlocking JumpstartTv.com así:

http://jumpstarttv.com/profiles/1379/Jonathan-Kehayias.aspx

Los bloqueos pueden ser difíciles de resolver, pero a menos que publique su información gráfica de interbloqueo, de todos modos no podemos hacer más que ofrecer enlaces a publicaciones e información sobre cómo resolver problemas cabellos.

8

Los bloqueos pueden ocurrir por muchas razones y, a veces, la solución de problemas de interbloqueos puede ser más un arte que una ciencia.

Lo que uso para encontrar y eliminar bloqueos, fuera de SQL Profiler, es una herramienta liviana que ofrece una representación gráfica de los interbloqueos a medida que ocurren. Cuando ve un punto muerto, puede profundizar y obtener información valiosa. Detector de interbloqueo - http://www.sqlsolutions.com/products/sql-deadlock-detector

Es una herramienta simple, pero para mí, hace exactamente lo que se supone que debe hacer. Una cosa: la primera vez que lo usé, tuve que esperar 15 minutos para que la herramienta reuniera suficientes métricas para comenzar a mostrar puntos muertos.

Cuestiones relacionadas