Предполагая, что:
- Я использую REPEATABLE_READ или SERIALIZABLE изоляцию транзакций (блокировки сохраняются при каждом доступе к строке)
- Мы говорим о нескольких потоках, одновременно обращающихся к нескольким таблицам.
У меня есть следующие вопросы:
- Возможно ли, чтобы операция
INSERT
вызывала тупик? Если да, укажите подробный сценарий, демонстрирующий, как может возникнуть взаимоблокировка (например, Thread 1 делает это, Thread 2 делает это,..., тупик). - Для бонусных очков: ответьте на один и тот же вопрос для всех других операций (например, SELECT, UPDATE, DELETE).
UPDATE: 3. Для супер бонусных очков: как я могу избежать тупика в следующем сценарии?
Данные таблицы:
- разрешений
[id BIGINT PRIMARY KEY]
- компании
[id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))
Я создаю новую компанию следующим образом:
- Разрешения INSERT INTO; - Вставляет permissions.id = 100
- INSERT INTO компании (name, permission_id) VALUES ('Nintendo', 100); - Вкладыши company.id = 200
Я удалю компанию следующим образом:
- SELECT permission_id FROM компании WHERE id = 200; - возвращает permission_id = 100
- УДАЛИТЬ ОТ компаний WHERE id = 200;
- УДАЛИТЬ ОТ разрешений WHERE id = 100;
В приведенном выше примере порядок блокировки INSERT является [разрешениями, компаниями], тогда как порядок блокировки DELETE - [компании, разрешения]. Есть ли способ исправить этот пример для изоляции REPEATABLE_READ
или SERIALIZABLE
?