Entrenamiento en Java de Beida Jade Bird: ¿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 interbloqueo es un error lógico muy común.
Al adoptar métodos de programación correctos, no es difícil evitar los puntos muertos.
Las cuatro condiciones necesarias para el punto muerto suelen introducirse en los libros de texto profesionales de informática.
Estas cuatro condiciones son indispensables, o mientras cualquiera de ellas sea destruida, no se producirá un punto muerto.
Revisemos estas cuatro condiciones: Exclusión mutua: existe un recurso que solo se puede asignar a un hilo de ejecución (también llamado hilo) en un momento determinado. Hold (Holdandwait): cuando se solicita. El recurso 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 (Nopreemption): el hilo de ejecución obtiene Los recursos mutuamente excluyentes no se pueden privar por la fuerza; En otras palabras, solo los propios ocupantes de recursos pueden liberar los recursos; espera circular: varios subprocesos de ejecución obtienen recursos mutuamente excluyentes en diferentes órdenes, formando así una situación de espera circular. Imagine que varios subprocesos obtienen recursos mutuamente excluyentes en diferentes órdenes. cadena de subprocesos de ejecución, cada subproceso de ejecución está esperando que el siguiente subproceso de ejecución libere los recursos que contiene.
No es difícil ver las condiciones necesarias para liberar el punto muerto. 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 al mismo tiempo. time Detecta puntos muertos a través del administrador de bloqueos y priva de recursos (revierte 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 "nivel de agua".
Independientemente de los bloqueos mantenidos, todas las operaciones de bloqueo de este subproceso deben realizarse en un orden constante de menor a mayor (o de mayor a menor) y, en un sistema, solo use una secuencia.
Tenga en cuenta que el orden en que se liberan los bloqueos no provoca un punto muerto.
En otras palabras, aunque pueda parecer extraño realizar operaciones de bloqueo en el orden de bloqueo A, bloqueo B, liberación A y liberación B, siempre y cuando todos se 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, envíe o revierta la transacción lo antes posible (refine la lógica de procesamiento, revierta o envíe después de ejecutar una parte de lógica 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: 3 minutos a 10 minutos, si se excede el tiempo, la operación se realizará automáticamente; abandonado para evitar la suspensión del proceso 3. Optimice el programa para verificar y evitar bloqueos. Se produce un fenómeno; 4 Todos los scripts y SP deben probarse cuidadosamente antes de su lanzamiento. 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, se reducirá la posibilidad de un punto muerto.
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 confirmar o revertir la primera transacción, la segunda transacción continúa.
No se produce ningún punto muerto.
El uso de procedimientos almacenados para todas las modificaciones de datos puede estandarizar el orden en el que se accede a los objetos.