¿Cómo evitar un punto muerto?

¿Qué es el punto muerto y cómo evitarlo?

El hilo A necesita recursos En la programación concurrente, el punto muerto es un error lógico muy común. Al adoptar métodos de programación correctos, no es difícil evitar los puntos muertos.

Cuatro condiciones necesarias para el punto muerto

En los libros de texto de informática se suelen introducir las cuatro condiciones necesarias para el punto muerto. Estas cuatro condiciones son indispensables; de lo contrario, mientras se viole cualquiera de ellas, no se producirá un punto muerto. Repasemos, estas cuatro condiciones son:

Exclusión mutua: existe un recurso que solo se puede asignar a un hilo (también llamado hilo) en un momento determinado;

Retener. (Holdandwait): cuando el recurso solicitado ha sido ocupado y el hilo de ejecución está bloqueado, el ocupante del recurso no solo no necesita liberar el recurso, sino que también puede continuar solicitando más recursos;

Nopreemption: el los recursos mutuamente excluyentes obtenidos por el subproceso de ejecución no se pueden privar por la fuerza. En otras palabras, solo el propio ocupante del recurso puede liberar el recurso;

Espera circular (Circularwait): varios subprocesos de ejecución adquieren recursos mutuamente excluyentes en diferentes órdenes. , formando así una situación de espera circular. Imagine que en una cadena circular compuesta por múltiples subprocesos de ejecución, cada subproceso de ejecución está esperando que el siguiente subproceso de ejecución libere los recursos que contiene.

Condiciones necesarias para liberar el punto muerto

No es difícil ver que entre las cuatro condiciones necesarias para el punto muerto, la segunda, tercera y cuarta condiciones son relativamente fáciles de eliminar. Al introducir un mecanismo de transacción, la segunda y tercera condiciones a menudo se pueden eliminar tratando todas las operaciones de bloqueo como transacciones. Una vez que se inicia el bloqueo, se garantiza que todas las operaciones se puedan revertir y se detecten puntos muertos a través del administrador de bloqueo. privar de recursos (revertir la transacción). Este enfoque a veces genera una mayor sobrecarga y requiere más cambios en el modelo de bloqueo.

Eliminar la cuarta condición es más fácil y menos costoso. Específicamente, este método está de acuerdo: el orden de bloqueo debe ser consistente. Específicamente, asignamos artificialmente un atributo direccional a la cerradura similar a un "nivel de agua". Independientemente de los bloqueos que ya se tengan, todas las operaciones de bloqueo de este subproceso deben realizarse en un orden coherente de menor a mayor (o de mayor a menor) y, en un sistema, solo se permite un orden.

Tenga en cuenta que el orden en que se liberan los bloqueos no provoca un punto muerto. En otras palabras, aunque puede parecer extraño realizar operaciones de bloqueo en el orden de bloquear A, bloquear B, liberar A y liberar B, siempre que todos bloqueen en el orden de A y luego B, no provocará un punto muerto.

Solución:

1 Cuando utilice transacciones, intente acortar el proceso de procesamiento lógico de la transacción y envíe o revierta la transacción lo antes posible (refine la lógica de procesamiento y revierta o retroceder después de ejecutar una sección de lógica) Enviar y luego ejecutar otra lógica hasta que la transacción se complete y envíe);

2 Establezca el parámetro de tiempo de espera de interbloqueo en un rango razonable, como por ejemplo: 3 minutos- 10 minutos; si se excede el tiempo, la operación se abandonará automáticamente. ¿Evitar que el proceso se cuelgue?

3 ¿Optimizar programas, verificar y evitar interbloqueos?

4 Todos los scripts y SP; debe ser probado cuidadosamente antes de ser liberado. ?

5 ¿Todos los SP deben tener manejo de errores (a través de @error)?

6 Generalmente no modifica el nivel predeterminado de las transacciones de SQLSERVER. No se recomienda el bloqueo forzado

Otra solución de referencia:

Acceder a los objetos en el mismo orden

Si todas las transacciones simultáneas acceden a los objetos en el mismo orden, la muerte ocurrirá. La posibilidad de bloqueo se reducirá.

Por ejemplo, si dos transacciones simultáneas adquieren un bloqueo en la tabla de Proveedores y luego adquieren un bloqueo en la tabla de Piezas, hasta que se complete una de las transacciones, la otra transacción se bloquea en la tabla de Proveedores. Después de que la primera transacción se confirma o se revierte, la segunda transacción continúa. No se produce ningún punto muerto. El uso de procedimientos almacenados para todas las modificaciones de datos estandariza el orden en el que se accede a los objetos.