Здравствуйте, PCherkasova, Вы писали:
PC>Вы знаете, я проверила в Юконе этот пример. Он вполне успешно работает: одна из транзакций откатывается.
Приведите пожалуйста код примера, видимо Вы что-то упустили... Напоминаю, что для корректной эмуляции именно версионного поведения для Юкона должны быть в наличии подходящие индексы, в статье я описывал этот момент (Иначе Юкон принимает за конфликт любое изменение данных в таблице).
К сожалению сейчас Юкона или другого версионника под рукой нет, как доберусь обязательно приведу рабочий пример.
PC>Поэтому вопрос, — от каких таких аномалий snapshot не избавляет, остается открытым.
Например еще от таких (Описан еще у Тома Кайта, если мне никто не изменяет):
--- Опять псевдокод
--- может существовать только одна запись x=1 или x=2
create table a (x int)
-- start T1, session 1
set transaction isolation level snapshot
begin
delete from a where x in (1,2)
insert into a (x) values(1)
-- start T2, session 2
set transaction isolation level snapshot
begin
delete from a where x in (1,2)
insert into a (x) values(2)
commit
-- commit T1, session 1
commit
select * from a
Предупреждаю сразу, Юкон этот фокус не пропустит, поскольку его snapshot несколько строже "классического", ввиду наличия предикатных блокировок но любой другой версионник даже глазом не моргнет. Более того, версионник не спасут и блокировочные хинты (типа FOR UPDATE), и фиктивные апдейты, только полная блокировка таблицы...
... [ RSDN@Home 1.1.4 revision 142 ]