traduccion meaning informatica door band deadlock

deadlock - meaning - ¿Cuáles son las razones más comunes para los bloqueos?



deadlock sql (12)

Los interbloqueos son difíciles de encontrar y muy incómodos de eliminar.

¿Cómo puedo encontrar fuentes de error para interbloqueos en mi código? ¿Hay algún "patrón de punto muerto"?

En mi caso especial, se trata de bases de datos, pero esta pregunta está abierta para cada punto muerto.


El escenario clásico de interbloqueo es A mantiene bloqueado X y quiere obtener el bloqueo Y, mientras que B mantiene bloqueado Y y desea obtener el bloqueo X. Como ninguno de los dos puede completar lo que están intentando hacer, ambos terminarán esperando por siempre (a menos que los tiempos de espera sean usado).

En este caso, se puede evitar un interbloqueo si A y B adquieren los bloqueos en el mismo orden.


El escenario de punto muerto DB más común (de acuerdo con mis observaciones no científicas) es muy simple:

  • Dos procesos leen algo (un registro DB, por ejemplo), ambos adquieren un bloqueo compartido en el recurso asociado (generalmente una página DB),
  • Ambos intentan hacer una actualización, tratando de actualizar sus bloqueos a exclusivos - voila, deadlock.

Esto puede evitarse especificando la cláusula "FOR UPDATE" (o similar, dependiendo de su RDBMS particular) si la lectura va seguida de una actualización. De esta forma, el proceso obtiene el bloqueo exclusivo desde el principio, lo que imposibilita el escenario anterior.


El escenario típico son planes de actualización no coincidentes (las tablas no siempre se actualizan en el mismo orden). Sin embargo, no es inusual tener bloqueos cuando se encuentra bajo un alto volumen de procesamiento.

Tiendo a aceptar bloqueos como un hecho de la vida, sucederá un día u otro, así que tengo mi DAL preparado para manejar y volver a intentar una operación estancada.


No hay patrones de interbloqueos que yo sepa (y 12 años de escribir aplicaciones comerciales de gran multiproceso). Pero la clase TimedLock ha sido de gran ayuda para encontrar interbloqueos que existen en el código sin una repetición masiva.

http://www.randomtree.org/eric/techblog/archives/2004/10/multithreading_is_hard.html

básicamente, (en dotnet / c #) busca / reemplaza todas sus declaraciones "lock (xxx)" con "using TimedLock.Lock (xxx)"

Si alguna vez se detecta un interbloqueo (no se puede obtener el bloqueo dentro del tiempo de espera especificado, por defecto es de 10 segundos), se lanza una excepción. Mi versión local también registra inmediatamente el stacktrace. Suba la pila (preferiblemente depuración con números de línea) e inmediatamente verá qué cerraduras se mantuvieron en el punto de falla y cuál intentaba obtener.

En dotnet 1.1, en una situación de interbloqueo como se describe, como la suerte lo tendría todos los hilos que estaban bloqueados arrojarían la excepción al mismo tiempo. Por lo tanto, obtendría 2 stacktraces y toda la información necesaria para solucionar el problema. (2.0+ puede haber cambiado el modelo de subprocesamiento internamente para que no sea tan afortunado, no estoy seguro)


Sí, los bloqueos se producen cuando los procesos intentan adquirir recursos en orden aleatorio. Si todos sus procesos intentan adquirir los mismos recursos en el mismo orden, las posibilidades de puntos muertos se reducen en gran medida, si no se eliminan.

Por supuesto, esto no siempre es fácil de arreglar ...


Recomiendo leer este artículo de Herb Sutter . Explica los motivos de los problemas de bloqueo y propone un marco en este artículo para abordar este problema.


Actualización: este reciente artículo de MSDN, Herramientas y técnicas para identificar problemas de simultaneidad , también podría ser de interés

Stephen Toub en el artículo de MSDN El monitor de interbloqueo establece las siguientes cuatro condiciones necesarias para que ocurran interbloqueos:

  • Un número limitado de un recurso en particular. En el caso de un monitor en C # (lo que usa cuando emplea la palabra clave de bloqueo), este número limitado es uno, ya que un monitor es un bloqueo de exclusión mutua (lo que significa que solo un subproceso puede ser propietario de un monitor a la vez).

  • La capacidad de mantener un recurso y solicitar otro. En C #, esto es similar a bloquear un objeto y luego bloquear otro antes de liberar el primer bloqueo, por ejemplo:


lock(a) { ... lock(b) { ... } }

  • Sin capacidad de preferencia. En C #, esto significa que un hilo no puede obligar a otro hilo a liberar un bloqueo.

  • Una condición de espera circular. Esto significa que hay un ciclo de hilos, cada uno de los cuales está esperando que el siguiente libere un recurso antes de que pueda continuar.

Continúa explicando que la forma de evitar los bloqueos es evitar (o frustrar) la condición cuatro.

Joe Duffy analiza varias técnicas para evitar y detectar interbloqueos, entre ellos uno conocido como nivelación de bloqueo. En la nivelación de bloqueos, a los bloqueos se les asignan valores numéricos, y los subprocesos solo deben adquirir bloqueos que tienen números más altos que los bloqueos que ya han adquirido. Esto evita la posibilidad de un ciclo. También es frecuentemente difícil hacerlo bien en una aplicación de software típica hoy en día, y si no se sigue la nivelación de bloqueo en cada adquisición de bloqueo se invita a un punto muerto.


Una condición que ocurre cuando dos procesos están esperando que la otra termine antes de que termine. El resultado es que ambos procedimientos se suspenden. su más multitarea comonelly y clint / server.


El punto muerto se produce principalmente cuando existen múltiples bloqueos dependientes. En un hilo y otro hilo intenta bloquear el mutex en el orden inverso ocurre. Uno debe prestar atención para usar un mutex para evitar interbloqueos.

Asegúrese de completar la operación después de liberar el bloqueo. Si tiene varios bloqueos, como el orden de acceso es ABC, el orden de liberación también debería ser ABC.


En mi último proyecto, tuve un problema con los interbloqueos en una base de datos SQL Server. El problema para encontrar la razón fue que mi software y un software de un tercero están usando la misma base de datos y están trabajando en las mismas tablas. Fue muy difícil averiguar qué causa los bloqueos. Terminé escribiendo una consulta sql para averiguar qué procesos y qué sentencias sql están causando los bloqueos. Puede encontrar esa declaración aquí: Interbloqueos en SQL-Server


Asegurarse de que todas las transacciones afecten a las tablas en el mismo orden es la clave para evitar el bloqueo más común.

Por ejemplo:

Transacción A

UPDATE Table A SET Foo = ''Bar'' UPDATE Table B SET Bar = ''Foo''

Transacción B

UPDATE Table B SET Bar = ''Foo'' UPDATE Table A SET Foo = ''Bar''

Es muy probable que esto resulte en un punto muerto ya que la Transacción A obtiene un bloqueo en la Tabla A, la Transacción B obtiene un bloqueo en la Tabla B, por lo tanto, ninguno de ellos obtiene un bloqueo para su segundo comando hasta que el otro finalice.

Todas las otras formas de bloqueos son generalmente causadas por el uso de alta intensidad y el bloqueo de SQL Server internamente, mientras que los recursos asignados.