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