Управление транзакциями и блокировками в базах данных, страница 3

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

Транзакции  в  многопользовательском режиме

            Для многопользовательских БД  характерна параллельная обработка данных. Чтобы повысить  производительность,  разным пользователям  (программам, процедурам) предоставляется одновременный доступ к таблицам, записям, полям и другим объектам. При этом необходимо принимать специальные меры, чтобы действия одного пользователя не оказывали непредусмотренного влияния на действия других пользователей.  

Рассмотрим пример параллельного выполнения двух транзакций  (ТА и ТБ):

ТА:                    UPDATE  счета

                          SET  баланс = баланс +2000

                          WHERE  номер_счета = 820;

ТБ:                     UPDATE  счета

                               SET   баланс = баланс +1000

                               WHERE   номер_счета = 820;

Результатом выполнения этих двух транзакций должно быть увеличение баланса счета
 № 820  на 3000 единиц. Пусть  исходный баланс счета составляет 5000 единиц.  Выполнение команды UPDATE  состоит из трех операций:

  1. извлекается  необходимая  запись из внешней памяти (ВП) в оперативную память (ОП);
  2. изменяется  значение счета в ОП;
  3. измененная  запись записывается  во  ВП.

Но при параллельном выполнении этих двух транзакций  на сервере БД может произойти следующая ситуация

Транзакция   А        (ТА)                                           Транзакция   Б         (ТБ)

1.Считать запись счета 820 в ОП.

2. Увеличить значение счета  на 2000.

3.  Записать измененную строку на диск

 

1.  Считать запись счета 820 в ОП.

4.  2.  Увеличить значение счета  на 1000.

5.  3.  Записать измененную строку на диск

 
 


                                              Порядок  обработки на сервере БД

  1. Считать запись счета  820 в ОП     (ТА).
  2. Считать запись счета  820 в ОП     (ТБ).
  3.  Увеличить значение счета  на 2000 (ТА). Значение счета в ОП  5000+2000=7000
  4. Увеличить значение счета  на 1000 (ТБ). Значение счета в ОП  5000+1000=6000
  5. ТА переносит запись на диск с балансом  7000.
  6.  ТБ переносит запись на диск с балансом  6000.
 
 

            …



Итоговое значение баланса составит 6000 вместо 8000. Возникшая ситуация ошибки носит название проблемы потерянного обновления (lost update problem).  

Главным способом исключения проблем возникновения ошибок (аномалий) при параллельной обработке является применение  механизмов блокировок данных.

Блокировка  данных

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

Механизм  блокировки (locking) заключается в следующем.  Когда начинает выполняться транзакция Т1  СУБД блокирует от других транзакций те записи  таблицы, к которым обращается эта транзакция с целью выборки и изменения данных.  Пусть параллельно выполняется другая транзакция Т2.  Если транзакция Т2  обращается к той части данных, которая заблокирована транзакцией Т1, то СУБД приостанавливает выполнение транзакции Т2 и заставляет её ожидать, пока транзакция Т1 не закончится инструкцией COMMIT  или  ROLLBACK ,  и данные не будут разблокированы. Теперь СУБД  разрешит продолжение выполнения транзакции Т2. Т.о.,  реализуется простой принцип очереди: «не все транзакции сразу, а по очереди».  

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

Используются следующие  уровни блокировок:

§  Блокировка всей БД – самая жесткая форма блокировки, легко осуществляемая, но и самая медленная, при этом  в каждый момент времени во всей  БД выполняется  только одна транзакция.

§  Блокировка на уровне таблиц -  блокируются только те таблицы, к которым обращается  транзакция. Остальные таблицы не блокируются,  и к ним  могут обращаться другие транзакции.

§  Блокировка на уровне страниц – СУБД блокирует только те физические страницы (блоки)  таблиц на диске, к которым в данный момент обращается очередная транзакция, другие  страницы таблиц не блокируются.

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