A menudo nos encontramos con esta situación en la base de datos: una tabla principal A y una subtabla B. La tabla B contiene la clave principal de la tabla A como clave externa. Cuando queramos insertar datos, primero los insertaremos en la tabla A, luego obtendremos la identidad de la tabla A y luego los insertaremos en la tabla B. Si desea realizar una operación de eliminación, elimine primero la subtabla B y luego elimine la tabla principal A. En programación, las operaciones en las dos tablas se completan en una transacción.
Cuando el sistema se utiliza con frecuencia, las operaciones de inserción y eliminación pueden ocurrir al mismo tiempo. En este momento, la transacción de inserción primero colocará un bloqueo exclusivo en la tabla principal A y luego accederá a la subtabla B. Al mismo tiempo, la transacción de eliminación colocará un bloqueo exclusivo en la subtabla B y luego acceder a la tabla principal A. La transacción de inserción siempre monopolizará la tabla A, esperando acceder a la tabla B, y la transacción de eliminación también monopolizará la tabla B, esperando acceder a la tabla A. Por lo tanto, las dos transacciones monopolizan una tabla entre sí, esperando que la otra parte la libere. recursos, lo que provoca un estancamiento.
He oído hablar de tres formas de hacer esto:
1. Cancelar la relación de clave externa entre las dos tablas AB, de modo que al eliminar datos, primero pueda eliminar la tabla principal A y luego eliminar la subtabla B, de modo que la La secuencia de acceso a las transacciones de estas dos operaciones de tabla es consistente.
2 Antes de eliminar los datos de la tabla A, primero utilice una transacción para señalar la clave externa relevante de la tabla B a otros datos de la tabla A (por ejemplo, cree una fila de datos en la tabla A y establezca la clave principal en 0. Esta fila de datos nunca será accedido realizar una operación de eliminación), eliminando así la relación entre los datos a eliminar en las dos tablas AB. Luego, puede utilizar una transacción de eliminación para eliminar primero los datos de la tabla A y luego eliminar los datos de la tabla B para lograr un acceso coherente a la tabla con la transacción de inserción y evitar un punto muerto.
3. En la relación de clave externa, establezca la "Regla de eliminación" en "En cascada", de modo que la transacción de eliminación solo necesite eliminar directamente la tabla principal A, sin operar la subtabla B. Porque después de configurar la regla de eliminación en cascada, los datos de la tabla principal se eliminan y todos los datos asociados con las claves externas en la subtabla también se eliminan al mismo tiempo.
Las tres soluciones anteriores son sugerencias de colegas y no sé qué método debería utilizarse.
Me pregunto si existen otras buenas formas de evitar un punto muerto en esta situación.
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html