В документации сказано, что serializable
транзакции выполняются одна за другой.
Но на практике это не похоже на правду. Вот две почти равные транзакции, разница всего в 15 секундах.
#1:
set transaction isolation level serializable
go
begin transaction
if not exists (select * from articles where title like 'qwe')
begin
waitfor delay '00:00:15'
insert into articles (title) values ('qwe')
end
commit transaction go
#2:
set transaction isolation level serializable
go
begin transaction
if not exists (select * from articles where title like 'qwe')
begin
insert into articles (title) values ('asd')
end
commit transaction go
Вторая транзакция была запущена через пару секунд после запуска первой.
Результат - тупик. Первая транзакция умирает с
Transaction (Process ID 58) was deadlocked on
lock resources with another process and has been chosen as the deadlock victim.
Rerun the transaction.
причина.
Вывод, сериализуемые транзакции не являются серийными?