SQL Server имеет SERIALIZABLE в дополнение к SNAPSHOT.Но, по крайней мере в SQL Server, для большинства практических целей SERIALIZABLE бесполезен, так как он слишком дорогой и не очень эффективен.И вы используете специальные конструкции для нескольких транзакций, которые на самом деле должны быть сериализованы (т.е. выполняются по одному).
SERIALIZABLE стоит дорого, потому что упорядочение транзакций выполняется с помощью некоторой комбинации, исключающей параллелизм, игенерирование сбоев во время выполнения (взаимоблокировки).И то, и другое очень дорого и хлопотно.
SERIALIZABLE не очень эффективно, потому что фактически не обеспечивает полной изоляции транзакций.Для этого потребовалось бы, чтобы каждая транзакция исключительно блокировала все данные, которые она считывает, чтобы две транзакции не считывали и не записывали одни и те же данные.
Классический пример - два сеанса:
SELECT salary FROM emp where id = 1
изатем вычислите новое значение на основе существующего в клиенте, а затем
UPDATE emp set salary = :newSalary
Единственный способ сделать эту работу правильным - это установить эксклюзивную блокировку при первом чтении, чтобы второй сеанс мог 'читаю тоже.
В Oracle это выполняется с помощью SELECT ... FOR UPDATE и в SQL Server с подсказкой UPDLOCK.Или с явной «блокировкой приложения», DMBS_LOCK от Oracle или sp_getapplock для SQL Server.