Здравствуйте, Merle
Вы знаете, я проверила в Юконе этот пример. Он вполне успешно работает: одна из транзакций откатывается.
Поэтому вопрос, — от каких таких аномалий snapshot не избавляет, остается открытым.
M>Так же, одной из классических аномалий, от которой snapshot не избавляет, и которую можно отнести к разновидности фантомов является Write Skew:
M>Допустим бизнес-логика требует, чтобы x+y<5, на данный момент x=1 и y=1, далее псевдокод:
M>M>-- для всех транзакций
M>SET TRANSACTION ISOLATION LEVEL SNAPSHOT
M>-- транзакция 1 (T1)
M>--
M>SELECT (X, Y)
M>-- надо добавить к X два,
M>-- проверяем, что X + 2 + Y < 5
M>--
M>IF ((X + 2) + Y < 5) -- все в порядке Y(=1) + X(=1+2)<5
M> UPDATE SET X=X+2
M>-- в этот момент стартует вторая транзакция
M>-- которой, в свою очередь, надо к Y добавить 2, естественно с проверкой.
M>--
M>SELECT (X, Y)
M>IF (X + (Y + 2) < 5) -- тоже все в порядке Y(=1+2) + X(=1)<5
M> UPDATE SET Y=Y+2 -- так как SELECT(X, Y) выбрал последнюю
M> -- зафиксированную версию X (=1)
M>-- ну и фиксируем обе транзакции в произвольном порядке.
M>--
M>COMMIT -- T1
M>COMMIT -- T2
M>
M>В многоверсионной истории это выглядит примерно так:
M>R1(x,y),W1(x),R2(x,y),W2(y),C1..,C2
M>Как нетрудно догадаться, в результате этих упражнений X+Y будет равно 6, что не соответствует никакому сценарию последовательного выполнения этих транзакций.