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, и даже не пытается
А вот здесь уже важно, какая транзакция началась раньше
〰️〰️〰️
Надеюсь, вам стало чуточку понятнее)