Serializability vs Linearizability

Этим понедельничным деньком настало время разобраться между двумя очень похожими терминами🤓 💋Есть 2 счета с денюжками: A=30 и В=70, Тотал=100. Они не могут в тотале уйти в минус. Две параллельные транзакции пытаются снять по 100

Что происходит в несериализуемой, сериализуемой и линеаризуемой системах? 1️⃣Несериализуемая

1: снимает 100 с А 2: снимает 100 с В Баланс: А=-70, В=-30, Тотал=-100 Возникла аномалия, мы нарушили правило банка

2️⃣Сериализуемая

1: снимает 100 с А и пытается закоммитить 2: снимает 100 с В и пытается закоммитить

БД сравнивает результат, как если бы они выполнялись последовательно. Если закоммитить сначала первую транзакцию, то состояние будет А=-70, В=70, Тотал=0. Вторая не может снять, потому что в тотале 0, она откатывается. Можем вместо первой закоммитить вторую, таймлайн не важен

3️⃣Линеаризуемая

1: снимает 100 с А, текущее состояние А=-70, В=70, Тотал=0 2: уже видит, что в тотале 0, и даже не пытается

А вот здесь уже важно, какая транзакция началась раньше

〰️〰️〰️

Надеюсь, вам стало чуточку понятнее)