Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции2011.doc
Скачиваний:
1
Добавлен:
19.02.2020
Размер:
1.86 Mб
Скачать

Уровни блокировки

В базе данных блокировка может быть реализована на различных уровнях. Самой грубой формой блокировки является блокировка всей базы данных. Этот вид блокировки легко реализовать, но при этом в каждый момент времени можно будет выполнять только одну транзакцию. Если транзакция затрачивает некоторое время "на размышления" (например, время обсуждения заказа с клиентом), то доступ всех остальных пользователей к базе данных будет при этом заблокирован, что приводит к слишком низкой производительности.

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

Во многих СУБД реализована блокировка на уровне страниц. В этом случае СУБД блокирует отдельные блоки данных на диске ("страницы"), когда транзакция обращается к ним. Остальным транзакциям запрещается доступ к заблокированным страницам, но они могут обращаться к другим страницам данных (и блокировать их для себя). Обычно используются страницы размером 2, 4 и 16 Кб. Поскольку большая таблица состоит из сотен или даже тысяч страниц, две транзакции, обращающиеся к двум различным строкам таблицы, как правило, обращаются к различным страницам. В результате этого обе транзакции выполняются параллельно.

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

Жесткая и нежесткая блокировки

В большинстве коммерческих СУБД для повышения параллельности доступа нескольких пользователей к одной базе данных используются блокировки различных типов. Наиболее широко распространены два из них:

  • Когда транзакция читает данные из базы данных, СУБД принимает нежесткую блокировку. При этом другие транзакции, выполняемые параллельно, могут считывать те же данные.

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

Тупиковые ситуации

К сожалению, применение любого механизма блокировки для поддержки параллельного выполнения транзакций приводит к проблеме, которая называется тупиком. Например, программа А обновляет таблицу orders и поэтому блокирует часть этой таблицы. Тем временем программа В обновляет таблицу products и блокирует часть ее. Затем программа А пытается обновить таблицу products, а программа В пытается обновить таблицу orders, причем каждая пытается обновить ту часть таблицы, которая заблокирована другой программой. Без внешнего вмешательства обе программы будут бесконечно ожидать, пока другая программа завершит транзакцию и разблокирует данные.

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