digital-garden/dev/fundamental/Deadlock.md
Struchkov Mark caffba83ec
All checks were successful
continuous-integration/drone/push Build is passing
Deadlock.md
2024-10-09 23:28:09 +03:00

3.3 KiB
Raw Blame History

aliases tags date zero-link parents linked
maturity/🌱
2024-06-20

Дедлок — это ситуация, при которой два или более Поток процесса ОС блокируют друг друга, ожидая освобождения ресурсов, которые удерживаются другим потоком. Чтобы понять это, нужно рассмотреть, что такое «блокировки» и «ресурсы».

Блокировка — это способ «захвата» ресурса, чтобы предотвратить доступ других потоков к этому ресурсу до завершения текущей операции.

Ресурс может быть любой частью программы, к которой требуется эксклюзивный доступ: файл, переменная, раздел памяти или даже объект базы данных.

Простой пример дедлока:

  • Поток A захватывает ресурс 1 (например, файл) и пытается получить доступ к ресурсу 2 (например, переменной), но этот ресурс уже захвачен потоком B.
  • Поток B захватывает ресурс 2 и пытается получить доступ к ресурсу 1, который удерживается потоком A.

В результате оба потока зависают — каждый ждёт освобождения ресурса, который удерживает другой поток. Это называется дедлоком, и программа перестаёт выполнять свои задачи, так как ни один из потоков не может продолжить работу.

Советы:

  • Делать транзакции короче.
  • Выполнить повторно откатившуюся транзакцию

Что реально поможет:

  • Разделить потоки чтения и записи: CQRS
  • Использовать материализованные view.
  • Изменить порядок блокировок ресурсов. Если в разных операциях блокируется определенный набор ресурсов, то блокироваться первым должен всегда один и тот же ресурс
  • Пересмотреть Уровни изоляций транзакций БД
  • Сразу использовать Exclusive lock. Но это сильно может сказаться на производительности.

Мета информация

Область:: ../../meta/zero/00 Разработка Родитель:: Multithreading Источник:: Автор:: Создана:: 2024-06-20

Дополнительные материалы

Дочерние заметки