Транзакция В
Разблокирована
|
S-блокировка
|
Х-блокировка
|
Транзакция А
|
Разблокирована
|
Да
|
Да
|
Да
|
S-блокировка
|
Да
|
Да
|
Нет
|
Х-блокировка
|
Да
|
Нет
|
Нет
|
Три случая, когда транзакция B не может блокировать объект, соответствуют трем видам конфликтов между транзакциями. Конфликты доступа к данным возникают в результате конкуренции. Транзакции называются конкурирующими, если они пересекаются по времени и обращаются к одним и тем же данным.
Различают следующие виды конфликтов:
W-W (Запись–Запись). Транзакция A изменила объект и не закончилась. Транзакция B пытается изменить тот же объект. Результат - потеря обновления;
R-W (Чтение–Запись). Транзакция B пытается изменить объект, прочитанный не закончившейся транзакцией A. Результат - несовместимый анализ (неповторимое чтение);
W-R (Запись–Чтение). Транзакция B пытается читать объект, измененный еще незакончившейся транзакцией A.
Доступ к объектам БД на чтение и запись осуществляется в соответствии с протоколом доступа к данным, который состоит из следующих требований:
1. прежде чем прочитать объект, транзакция должна наложить на этот объект S-блокировку;
2. прежде чем обновить объект, транзакция должна наложить на этот объект X-блокировку. Если транзакция уже заблокировала объект S-блокировкой (для чтения), то перед обновлением объекта S-блокировка должна быть заменена X-блокировкой;
3. если блокировка объекта транзакцией B отвергается от того, что объект уже заблокирован транзакцией A, то транзакция B переходит в состояние ожидания. Транзакция B находится в состоянии ожидания до тех пор, пока транзакция A не снимет блокировку объекта;
4. X-блокировки, наложенные транзакцией A, сохраняются до конца транзакции A.
Рассмотрим, как будут себя вести транзакции, вступающие в конфликт при доступе к данным, если они подчиняются протоколу доступа к данным.
На рисунке приведен ранее рассмотренный пример с выполнением транзакций 1 и 2, но с учетом разных типов блокировки. На рисунке 8.2 видно, что, применив нежесткую блокировку к таблице 2 со стороны транзакции 1, мы обеспечили существенное уменьшение времени выполнения транзакции 2. Теперь транзакция 2 не ждет окончания транзакции 1, и поэтому завершает свою работу намного раньше.
Рисунок 8.2 - Использование жесткой и нежесткой блокировки
К сожалению, применения разных типов блокировок приводит к проблеме тупиков.
Рассмотрим пример. Пусть транзакция А сначала жестко блокирует таблицу 1, а потом жестко блокирует таблицу 2. Транзакция B, наоборот, сначала жестко блокирует таблицу 2, а потом жестко блокирует таблицу 1. Если обе эти транзакции начали работу одновременно, то после выполнения операций модификации первыми объектами каждой транзакции они обе окажутся в бесконечном ожидании: транзакция А будет ждать завершения работы транзакции B и разблокировки таблицы 2, а транзакция В также безрезультатно будет ждать окончания работы транзакции А и разблокировки таблицы 1.
Рисунок 8.3 - Взаимная блокировка транзакций
Do'stlaringiz bilan baham: |