Предполагая:Может ли операция INSERT привести к взаимоблокировке?
- Я использую REPEATABLE_READ или SERIALIZABLE изоляции транзакций (замки получить сохраняются каждый раз, когда я получить доступ к ряду)
- Мы говорим о нескольких потоках доступа к нескольким таблицам одновременно.
У меня есть следующие вопросы:
- ли возможно для
INSERT
операции, чтобы вызвать затор? Если да, предоставьте подробный сценарий, демонстрирующий, как может возникнуть взаимоблокировка (например, Thread 1 делает это, Thread 2 делает это, ..., deadlock). - Для бонусных очков: ответьте на один и тот же вопрос для всех других операций (например, 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 компании (имя, permission_id) VALUES ('Nintendo', 100); - Вставки companies.id = 200
удалить компанию следующим образом:
- ВЫБРАТЬ permission_id ОТ компаний WHERE ID = 200; - возвращает permission_id = 100
- УДАЛИТЬ ОТ компаний WHERE id = 200;
- УДАЛИТЬ ОТ разрешений WHERE id = 100;
В приведенном выше примере порядок блокировки INSERT является [разрешениями, компаниями], тогда как порядок блокировки DELETE - [компании, разрешения]. Есть ли способ исправить этот пример для изоляции REPEATABLE_READ
или SERIALIZABLE
?
Сценарий определяется как одного пользователя (в одной транзакции) вставка, выбор и удаление не будет вызывать тупик. –
@CleverIdeaWidgetry, я уточнил вопрос, чтобы отразить тот факт, что мы говорим о нескольких потоках и таблицах. – Gili
Ответ на ваш основной вопрос «не так ли?» да, как говорили другие. Есть ли какое-то препятствие, препятствующее вам самому тестировать свой сценарий? –