пʼятниця, 24 липня 2015 р.

Сценарии возникновения нежелательных эффектов (потерянные изменения, грязное чтение...)



Проиллюстрируем нежелательные эффекты, возникающие при параллельном выполнении транзакций на примере таблицы EXAMPLE. Мы предполагаем, что в начале выполнения каждого следующего пункта содержимое этой таблицы возвращается к исходному, а именно:
Таблица EXAMPLE
id INTEGERdat INTEGER
1100
2110
3120
4130

5.3.1 Потерянные изменения

Транзакция T1ШагТранзакция T2
UPDATE example SET dat=dat+1 WHERE id=11 
 2UPDATE example SET dat=dat+1 WHERE id=1
COMMIT3 
 4COMMIT
SELECT * FROM example5 
Если потерянные изменения допускаются, то сценарий выполнится без ошибок и блокировок. На шаге 5 будет выбрано:
        id         dat 
---------- -----------
         1         101
         2         110
         3         120
         4         130

5.3.2 Грязное чтение

Транзакция T1ШагТранзакция T2
 1UPDATE example SET dat=101 WHERE id=1
UPDATE example SET dat= (SELECT dat FROM example WHERE id=1) WHERE id=22 
SELECT * FROM example3 
 4ROLLBACK
 5SELECT * FROM example
Если грязное чтение допускается, то сценарий выполнится без ошибок и блокировок.
На шаге 3 будет выбрано:
        id         dat 
---------- -----------
         1         101
         2         101
         3         120
         4         130

На шаге 5 будет выбрано:
        id         dat 
---------- -----------
         1         100
         2         101
         3         120
         4         130

5.3.3 Неповторяющееся чтение

Транзакция T1ШагТранзакция T2
SELECT * FROM example WHERE id=11 
[COMMIT]2UPDATE example SET dat=101 WHERE id=1
 3COMMIT
SELECT * FROM example WHERE id=14 
COMMIT5 
Если неповторяющееся чтение допускается, то сценарий выполнится без ошибок и блокировок. Операцию COMMIT в транзакции T1 на шаге 2 выполнять не придется.
На шаге 1 будет выбрано:
        id         dat 
---------- -----------
         1         100
На шаге 4 будет выбрано:
        id         dat 
---------- -----------
         1         101
Если выполнить операцию COMMIT на шаге 2, то результаты будут те же, что и без нее, но здесь уже не будет эффекта неповторяющегося чтения, так как разные результаты будут прочитаны уже в разных транзакциях.

5.3.4 Фантом

Транзакция T1ШагТранзакция T2
SELECT * FROM example WHERE dat>1101 
[COMMIT]2INSERT INTO example VALUES(5,140)
 3COMMIT
SELECT * FROM example WHERE dat>1104 
COMMIT5 
Если допускаются фантомы, то сценарий выполнится без ошибок и блокировок. Операцию COMMIT в транзакции T1 на шаге 2 выполнять не придется.
На шаге 1 будет выбрано:
        id         dat 
---------- -----------
         3         120
         4         130

На шаге 4 будет выбрано:
        id         dat 
---------- -----------
         3         120
         4         130
         5         150

Немає коментарів:

Дописати коментар