Comments 2
То есть, если Алиса и Боб выполняют одновременно две транзакции, то возможно только два варианта последовательного выполнения:
Здесь почему-то всегда упускают, что ни один движок не гарантирует выполнение сразу обеих транзакций ввиду возможного их конфликта. А сериализуемость в этом случае достигается внешними средствами, например, повторением транзакции.
Если поток транзакций является одновременно сериализуемым и линаризуемым (операции применяются мгновенно), то мы получаем модель строгой сериализуемости (Strict Serializable).
Они не обязаны "применяться мгновенно". Для Strict-serializable достаточно, чтобы было введено отношение "happened-before", которое задает частичный порядок для перекрывающихся регистров. При этом для операций с независимыми регистрами порядок может отсутствовать.
Для реализации сериализуемости могут использовать либо блокировк/и, либо механизм MVCC (Multi-Version Concurrency Control).
Важно что для реализации сериализуемости необходимы блокировки не только на запись, но и на чтение, а в случае MVCC вконце транзакции должны проверяться версии всех прочитанных ею данных с текущими, что приводит к значительным накладным расходам с случае больших объемов данных.
Начало хорошее, но тема не раскрыта. У Клеппмана в DDIA хорошо раскрыта тема Сериализуемости, на пальцах тот же 2PL и SSI (по сути просто optimistic lock) разбираются.
Сериализуемость транзакций