Freqüentemente encontramos esta situação no banco de dados: uma tabela principal A e uma subtabela B. A tabela B contém a chave primária da tabela A como chave estrangeira. Quando quisermos inserir dados, primeiro inseriremos na tabela A, depois obteremos a identidade da tabela A e depois inseriremos na tabela B. Se você deseja executar uma operação de exclusão, exclua primeiro a subtabela B e, em seguida, exclua a tabela principal A. Na programação, as operações nas duas tabelas são concluídas em uma transação.
Quando o sistema é usado com frequência, as operações de inserção e exclusão podem ocorrer ao mesmo tempo. Neste momento, a transação de inserção primeiro colocará um bloqueio exclusivo na tabela principal A e, em seguida, acessará a subtabela B. Ao mesmo tempo, a transação de exclusão colocará um bloqueio exclusivo na subtabela B e, em seguida, acesse a tabela principal A. A transação de inserção sempre monopolizará a tabela A, aguardando para acessar a tabela B, e a transação de exclusão também monopolizará a tabela B, aguardando para acessar a tabela A. Portanto, as duas transações monopolizam uma tabela uma para a outra, aguardando a liberação da outra parte. recursos, o que causa um impasse.
Ouvi falar de três maneiras de fazer isso:
1. Cancele o relacionamento de chave estrangeira entre as duas tabelas AB, para que, ao excluir dados, você possa primeiro excluir a tabela principal A e, em seguida, excluir a subtabela B, para que o A sequência de acesso à transação dessas duas operações de tabela é consistente.
2 Antes de excluir os dados da tabela A, primeiro use uma transação para apontar a chave estrangeira relevante na tabela B para outros dados na tabela A (por exemplo, crie uma linha de dados na tabela A e defina a chave primária como 0. Esta linha de dados nunca será acessado Execute uma operação de exclusão), eliminando assim a relação entre os dados a serem excluídos nas duas tabelas AB. Em seguida, você pode usar uma transação de exclusão para primeiro excluir os dados da tabela A e, em seguida, excluir os dados da tabela B para obter acesso consistente à tabela com a transação de inserção e evitar impasse.
3. No relacionamento de chave estrangeira, defina a “Regra de exclusão” como “Cascading”, de forma que a transação de exclusão só precise excluir diretamente a tabela principal A, sem operar a subtabela B. Porque depois que a regra de exclusão é definida como cascata, os dados da tabela principal são excluídos e todos os dados associados às chaves estrangeiras na subtabela também são excluídos ao mesmo tempo.
As três soluções acima são sugestões dadas por colegas e não sei qual método deve ser usado.
Gostaria de saber se existem outras boas maneiras de evitar impasses nesta situação?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html