Оформить и купить диплом на бланке ГОЗНАК без предоплаты

Блокировки

Для управления параллелизмом при выполнении транзакций в СУБД используется механизм блокировок. Если при выполнении транзакции имеет место обращение к таблице, СУБД блокирует фрагмент таблицы до тех пор, пока транзакция не будет зафиксирована или отменена. Другая транзакция может выполняться параллельно и может блокировать на момент своего выполнения другие таблицы. Если в процессе выполнения второй транзакции делается попытка получить доступ к блокированной первой транзакцией таблице, обработка второй транзакции приостанавливается и возобновляется только после того, как первая транзакция завершится и освободит блокированные ею таблицы.

Блокировки задерживают операции над таблицами, пока другие операции или транзакции не завершены. Задержанные операции выстраиваются в очередь.

Транзакции могут попасть в тупиковую ситуацию, в состояние неразрешимой взаимоблокировки. Для  предотвращения тупика СУБД должна периодически проверять блокировки, установленные активными транзакциями. Если СУБД обнаружит взаимоблокировку, она должна выбрать одну из транзакций, вызвавшую ситуацию взаимоблокировки, и прервать ее. Это освобождает данные для внесения изменений конкурирующей транзакцией, разрешая тупиковую ситуацию. Программа, которая инициировала прерванную транзакцию, получает сообщение, информирующее ее о причине прерывания.

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

Во всех СУБД имеется тип блокировки по умолчанию.

В литературе по СУБД часто встречается термин OLTP (On-Line Transaction Processing), который обычно переводят как “оперативная обработка транзакций”, т. е. выполнение транзакций в режиме реального времени. Система OLTP учитывает жесткие временные требования, следующие из специфики прикладной области. Например, процедура покупки и оформления авиабилета должна происходить очень быстро и не задерживать очередь покупателей. Система для продажи билетов должна обрабатывать одновременно сотни запросов (транзакций), поступающих от множества продавцов авиабилетов. Требования по скорости обработки запроса могут быть очень жесткими – менее секунды. Область OLTP  – это массированный поток коротких и простых транзакций, исходящих от сотен и тысяч пользователей к базе данных большого объема.

Механизм блокировок разрешает проблемы, связанные с доступом нескольких пользователей (программ) к одним и тем же данным. Однако его применение связано с существенным замедлением обработки транзакций вследствие ожидания момента, когда освободятся данные, захваченные конкурирующей транзакцией. Можно пытаться минимизировать вызванный этим ущерб, подбирая фрагменты данных, захватываемые транзакцией. Можно блокировать таблицу, страницу, отдельную строку. В больших СУБД применяется также блокировка областей DBS (Data Base Spaces),  называемых  Разделами Базы Данных. Данные в области DBS размещают физически близко друг к другу для того, чтобы они извлекались с минимальной задержкой.

Степень охвата данных блокировкой называется уровнем блокировки.

Современные СУБД используют блокировки чаще на уровне страниц и реже на уровне строк. При блокировке на уровне страниц СУБД захватывает для выполнения транзакции фрагмент таблицы, запрещая доступ к нему конкурирующим транзакциям, которые, впрочем, могут захватить другие страницы той же таблицы. Так как размер страниц обычно невелик (2...4 Кбайт), то время ожидания транзакциями, конкурирующими за доступ к страницам таблицы, оказывается приемлемым даже для режима OLTP.

Если СУБД реализована таким образом, что может блокировать для выполнения транзакции отдельные строки таблицы, то скорость обработки транзакции существенно повышается. Блокировка на уровне строк позволяет добиться максимальной производительности за счет того, что захватываемый объект  является минимальной структурной единицей базы данных. Теоретически, блокировка на уровне элементов данных (захват конкретного поля строки) позволит добиться наивысшей производительности.

Помимо уровней блокировки используют также термин «тип блокировки», или «схема блокировки». Транзакции могут захватывать данные, запрещая доступ к ним другим транзакциям (тип блокировки EXCLUSIVE), либо разрешать им доступ, но только для чтения (тип блокировки SHARE).

Блокировка таблицы осуществляется внутри транзакции однократно. Это означает, что невозможно изменить тип блокировки внутри транзакции, например с SHARE на EXCLUSIVE; это можно сделать только по завершении транзакции.