теория

Что на самом деле обещает транзакция

Смотри, «двойное списание» мы закрыли идемпотентностью — и это, оказывается, была лёгкая история. Вторая, с минусом на счёте, глубже, и чтобы в ней разобраться, надо честно понять, что такое и что она тебе обещает.

Транзакция — это группа операций, которые выполняются как одно целое: либо все вместе, либо ни одной. За этим стоит знакомый акроним : атомарность (всё или ничего), согласованность, изоляция, долговечность. Три из четырёх свойств обычно понятны без пояснений, а вот изоляция — источник почти всех денежных сюрпризов.

Дело в том, что транзакции идут не по одной, а толпой, одновременно. И — это, по сути, договор: какие гонки между одновременными транзакциями база берёт на себя, а какие тихо оставляет тебе. И вот что важно: по умолчанию база оставляет тебе больше, чем ты думаешь.

Уровней несколько, по нарастанию строгости:

  • Read committed — видишь только зафиксированные чужие изменения (не видишь чужих «черновиков»). Минимум приличия, стоит почти во всех базах по умолчанию.
  • Snapshot isolation — каждая транзакция видит согласованный снимок данных на момент старта, будто мир замер. Защищает от многого — но, как мы сейчас увидим, не от всего: у этой конкретной дыры есть имя — , и мы её вот-вот поймаем.
  • Serializable — сильнейший уровень: всё ведёт себя так, будто транзакции шли строго по одной, в очередь.

Ключевая мысль, которую индустрия усвоила кровью: более слабая изоляция не значит „сломанная“ — она значит „часть гонок теперь твоя забота“. База по умолчанию быстрая и слабая. Хочешь сильных гарантий — проси их явно и плати за них. А чем именно платишь — в следующей теории. Сначала посмотрим, как невинная с виду проверка баланса уводит счёт в минус.

← назад