Блокировка параллельного управления
Использование блокировки для управления доступом к общим ресурсам подвержено взаимоблокировкам, и один только планировщик транзакций не может предотвратить их возникновение.
Например, системы реляционных баз данных используют различные блокировки, чтобы гарантировать свойства ACID транзакции .
Независимо от того, какую систему реляционной базы данных вы используете, блокировки всегда будут получены при изменении (например, UPDATE
или DELETE
) определенной записи таблицы. Без блокировки строки, которая была изменена текущей выполняющейся транзакцией, атомарность была бы скомпрометирована .
Что такое тупик
Как я объяснил в этой статье , взаимоблокировка возникает, когда две параллельные транзакции не могут прогрессировать, потому что каждая ждет, пока другая снимет блокировку, как показано на следующей диаграмме.
Поскольку обе транзакции находятся в фазе получения блокировки, ни одна из них не снимает блокировку до получения следующей.
Восстановление из тупиковой ситуации
Если вы используете алгоритм управления параллелизмом, основанный на блокировках, то всегда существует риск запуска в тупиковой ситуации. Взаимные блокировки могут возникать в любой среде параллелизма, а не только в системе баз данных.
Например, многопоточная программа может зайти в тупик, если два или более потоков ждут блокировок, которые были получены ранее, так что ни один поток не может сделать никакого прогресса. Если это происходит в приложении Java, JVM не может просто заставить поток остановить его выполнение и снять блокировки.
Даже если Thread
класс предоставляет stop
метод, этот метод считается устаревшим с Java 1.1, поскольку он может привести к тому, что объекты останутся в несогласованном состоянии после остановки потока. Вместо этого Java определяетinterrupt
метод, который действует как подсказка, поскольку поток, который прерывается, может просто игнорировать прерывание и продолжать его выполнение.
По этой причине Java-приложение не может восстановиться из ситуации взаимоблокировки, и разработчик приложения обязан упорядочить запросы на получение блокировки таким образом, чтобы взаимные блокировки никогда не возникали.
Тем не менее, система базы данных не может принудительно применить данный порядок получения блокировки, так как невозможно предвидеть, какие другие блокировки определенная транзакция захочет получить дополнительно. Сохранение порядка блокировки становится обязанностью уровня доступа к данным, и база данных может только помочь в восстановлении после тупиковой ситуации.
Механизм базы данных запускает отдельный процесс, который сканирует текущий график конфликтов на предмет циклов ожидания блокировки (которые вызваны взаимными блокировками). Когда цикл обнаружен, ядро базы данных выбирает одну транзакцию и прерывает ее, вызывая снятие блокировок, чтобы другая транзакция могла совершить прогресс.
В отличие от JVM, транзакция базы данных разработана как элементарная единица работы. Следовательно, откат оставляет базу данных в согласованном состоянии.
Для более подробной информации по этой теме, проверьте эту статью .