Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 35

Таблица 5.1 – Конфликт «чтение после записи»

Время

Транзакция T1

Транзакция T2

Поле «счет»

t1

t2

t3

t4

t5

t6

t7

t8

начало_транзакции

чтение(счет, сч1)

сч1 := сч1 + 100

запись(сч1, счет)

откат

начало_транзакции

чтение(счет, сч2)

сч2 := сч2 – 10

запись(сч2, счет)

фиксация

100

100

100

200

200

100

190

190

3. Запись после чтения (неповторяемое чтение).

Проблема записи после чтения имеет место, когда транзакция производит запись в поля, считанные ранее другой, еще не завершившейся, транзакцией. В табл. 5.2 описывается ситуация, когда транзакция T1 вычисляет сумму полей сч1 и сч2, а T2, не дожидаясь завершения T1, выполняет свои вычисления над полем сч1. В результате получается несогласованность значений: сумма 90 и 50 будто бы равна 150.

Таблица 5.2 – Конфликт «запись после чтения»

Время

Транзакция T1

Транзакция T2

сч1

сч2

сум

t1

t2

t3

t4

t5

t6

t7

начало_транзакции

сум := 0

сч11 := сч1

сум := сум + сч11

сч21 := сч2

сум = сум + сч21

фиксация

начало_транзакции

сч12 := сч1

сч12 := сч12 – 10

сч1 := сч12

фиксация

100

100

100

100

90

90

90

50

50

50

50

50

50

50

0

0

100

100

150

150

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

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

5.2.1. Понятие блокировки

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

Разблокирование ресурсов может быть произведено сразу после выполнения соответствующей операции чтения/записи, или же в момент окончания работы всей транзакции. В последнем случае речь идет о так называемой двухфазной блокировке. Транзакция выполняется по протоколу двухфазной блокировки, если все операции блокирования в ней предшествуют первой операции разблокирования. Таким образом, можно четко выделить две фазы в работе транзакции: фазу нарастания (ресурсы блокируются) и фазу сжатия (ресурсы разблокируются). Хотя двухфазное блокирование в ряде случаев снижает эффективность параллельной обработки транзакций, во многих случаях обеспечивает большую изолированность, чем немедленное разблокирование.

Американский национальный институт стандартов (ANSI) определяет четыре  уровня блокирования.

1. Level 0 – No trashing of data (запрещение «загрязнения» данных).

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

2. Level 1 – No dirty read (запрещение «грязного» чтения).

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

3. Level 2 – No nonrepeatable read (запрещение неповторяемого чтения).

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

4. Level 3 – No phantom (запрещение фантомов).