В случае физического отказа системы, если ни журнал, ни сама база данных не повреждена, то выполняется процесс прогонки в прямом направлении от последней контрольной точки. Из журнала извлекаются все записи от контрольной точки до конца журнала. Эта информация вносится в блоки данных внешней памяти для корректировки информации.
Транзакции в многопользовательском режиме
Для многопользовательских БД характерна параллельная обработка данных. Чтобы повысить производительность, разным пользователям (программам, процедурам) предоставляется одновременный доступ к таблицам, записям, полям и другим объектам. При этом необходимо принимать специальные меры, чтобы действия одного пользователя не оказывали непредусмотренного влияния на действия других пользователей.
Рассмотрим пример параллельного выполнения двух транзакций (ТА и ТБ):
ТА: UPDATE счета
SET баланс = баланс +2000
WHERE номер_счета = 820;
ТБ: UPDATE счета
SET баланс = баланс +1000
WHERE номер_счета = 820;
Результатом выполнения этих двух
транзакций должно быть увеличение баланса счета
№ 820 на 3000 единиц. Пусть исходный баланс счета составляет 5000 единиц. Выполнение
команды UPDATE состоит из трех операций:
Но при параллельном выполнении этих двух транзакций на сервере БД может произойти следующая ситуация
Транзакция А (ТА) Транзакция Б (ТБ)
|
|
Порядок обработки на сервере БД
|
…
Итоговое значение баланса составит 6000 вместо 8000. Возникшая ситуация ошибки носит название проблемы потерянного обновления (lost update problem).
Главным способом исключения проблем возникновения ошибок (аномалий) при параллельной обработке является применение механизмов блокировок данных.
Блокировка данных
Блокировка – это процедура, используемая для управления параллельным доступом к данным. Она означает ограничение доступа к данным других пользователей в течение некоторого промежутка времени, обычно небольшого.
Механизм блокировки (locking) заключается в следующем. Когда начинает выполняться транзакция Т1 СУБД блокирует от других транзакций те записи таблицы, к которым обращается эта транзакция с целью выборки и изменения данных. Пусть параллельно выполняется другая транзакция Т2. Если транзакция Т2 обращается к той части данных, которая заблокирована транзакцией Т1, то СУБД приостанавливает выполнение транзакции Т2 и заставляет её ожидать, пока транзакция Т1 не закончится инструкцией COMMIT или ROLLBACK , и данные не будут разблокированы. Теперь СУБД разрешит продолжение выполнения транзакции Т2. Т.о., реализуется простой принцип очереди: «не все транзакции сразу, а по очереди».
Блокировки разделяют на жесткие и нежесткие. Нежесткие блокировки заключаются в возможности параллельного чтения данных несколькими транзакциями. Жесткая блокировка означает, что если одна транзакция заблокировала определенные данные, то другая транзакция не может обращаться к тем же данным ни для выборки, ни для записи.
Используются следующие уровни блокировок:
§ Блокировка всей БД – самая жесткая форма блокировки, легко осуществляемая, но и самая медленная, при этом в каждый момент времени во всей БД выполняется только одна транзакция.
§ Блокировка на уровне таблиц - блокируются только те таблицы, к которым обращается транзакция. Остальные таблицы не блокируются, и к ним могут обращаться другие транзакции.
§ Блокировка на уровне страниц – СУБД блокирует только те физические страницы (блоки) таблиц на диске, к которым в данный момент обращается очередная транзакция, другие страницы таблиц не блокируются.
§ Блокировка на уровне строк – допускается выполнение параллельных транзакций, которые обращаются к двум различным строкам таблицы, даже если они располагаются на одной физической странице.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.