Дедлок — это ситуация, при которой два или более потока блокируют друг друга, ожидая освобождения ресурсов, которые удерживаются другим потоком. Чтобы понять это, нужно рассмотреть, что такое «блокировки» и «ресурсы».
Блокировка — это способ «захвата» ресурса, чтобы предотвратить доступ других потоков к этому ресурсу до завершения текущей операции.
Ресурс может быть любой частью программы, к которой требуется эксклюзивный доступ: файл, переменная, раздел памяти или даже объект базы данных.
Простой пример дедлока:
- Поток A захватывает ресурс 1 (например, файл) и пытается получить доступ к ресурсу 2 (например, переменной), но этот ресурс уже захвачен потоком B.
- Поток B захватывает ресурс 2 и пытается получить доступ к ресурсу 1, который удерживается потоком A.
В результате оба потока зависают — каждый ждёт освобождения ресурса, который удерживает другой поток. Это называется дедлоком, и программа перестаёт выполнять свои задачи, так как ни один из потоков не может продолжить работу.
Советы:
- Делать транзакции короче.
- Выполнить повторно откатившуюся транзакцию
Что реально поможет:
- Разделить потоки чтения и записи: CQRS
- Использовать материализованные view.
- Изменить порядок блокировок ресурсов. Если в разных операциях блокируется определенный набор ресурсов, то блокироваться первым должен всегда один и тот же ресурс
- Пересмотреть Уровни изоляций транзакций БД
- Сразу использовать Exclusive lock. Но это сильно может сказаться на производительности.
Мета информация
Область:: 00 Разработка
Родитель:: Многопоточность
Источник::
Автор::
Создана:: 2024-06-20