Мы часто сталкиваемся с такой ситуацией в базе данных: основная таблица A и подтаблица B. Таблица B содержит первичный ключ таблицы A в качестве внешнего ключа. Когда мы хотим вставить данные, мы сначала вставляем их в таблицу A, затем получаем идентификатор таблицы A, а затем вставляем в таблицу B. Если вы хотите выполнить операцию удаления, сначала удалите подтаблицу B, а затем удалите основную таблицу A. В программировании операции над двумя таблицами выполняются за одну транзакцию.
Когда система используется часто, операции вставки и удаления могут выполняться одновременно. В это время транзакция вставки сначала устанавливает монопольную блокировку на основную таблицу A, а затем обращается к подтаблице B. В то же время транзакция удаления устанавливает монопольную блокировку на подтаблицу B, а затем получить доступ к основной таблице A. Транзакция вставки всегда будет монополизировать таблицу A, ожидая доступа к таблице B, а транзакция удаления также монополизирует таблицу B, ожидая доступа к таблице A. Таким образом, две транзакции монополизируют таблицу друг для друга, ожидая освобождения другой стороны. ресурсы, что приводит к тупику.
Я слышал о трех способах сделать это:
1. Отменить связь внешнего ключа между двумя таблицами AB, чтобы при удалении данных можно было сначала удалить основную таблицу A, а затем удалить подтаблицу B, чтобы Последовательность доступа к транзакциям этих двух табличных операций одинакова.
2. Прежде чем удалять данные в таблице A, сначала используйте транзакцию, чтобы указать соответствующий внешний ключ в таблице B на другие данные в таблице A (например, создайте строку данных в таблице A и установите для первичного ключа значение 0). Эта строка данных никогда не будет доступен. Выполните операцию удаления), тем самым устраняя связь между удаляемыми данными в двух таблицах AB. Затем вы можете использовать транзакцию удаления, чтобы сначала удалить данные в таблице A, а затем удалить данные в таблице B, чтобы обеспечить согласованный доступ к таблице с транзакцией вставки и избежать взаимоблокировки.
3. В отношениях внешнего ключа установите для параметра «Правило удаления» значение «Каскадное», чтобы транзакция удаления требовала непосредственного удаления только основной таблицы A без работы с подтаблицей B. Поскольку после того, как правило удаления установлено на каскадное, данные в основной таблице удаляются, и все данные, связанные с внешними ключами в подтаблице, также удаляются одновременно.
Все три вышеприведенных решения — это предложения коллег, и я не знаю, какой метод следует использовать.
Интересно, есть ли другие хорошие способы предотвратить тупик в этой ситуации?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html