Практикум по данным и отказам

Как заказ переживает сбой: транзакции, реплики и восстановление

Проследите заказ от списания остатка до оплаты и восстановления: изоляция транзакций, WAL, реплики, повторы сообщений и испытание отказов.

От основ к решениям220 минут12 модулей26 вопросов
После курса

Что вы сможете сделать

  1. Определить границу заказа и внешнего платежа; разобрать неопределённый итог после потерянного ответа.
  2. Выбрать изоляцию для конкретного конкурентного сценария и повторить транзакцию после ошибки сериализации.
  3. Связать подтверждение с WAL и удалённым этапом записи; отличить отставание применения от утраты истории.
  4. Рассчитать большинство и различить наличие записи, её фиксацию, применение и порядок чтения.
  5. Различить подтверждение производителя Kafka, позицию потребителя и внешний эффект; проверить границу повторов и подготовленной транзакции.
  6. Составить приёмку восстановления заказа вместе с проверкой приложения и внешних результатов.
Модуль 1 из 12

Что входит в один заказ?

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

  • Транзакция объединяет операции базы до фиксации или отката. Если запись заказа и уменьшение остатка находятся внутри одной транзакции, её откат отменяет обе работы с данными. Отдельно выполненный платёж или отправленное сообщение в эту границу автоматически не входят.

  • Четыре свойства ACID отвечают на разные вопросы. Атомарность — какие изменения принимаются вместе; согласованность — какие правила состояния сохраняются; изоляция — как взаимодействуют параллельные операции; долговечность — какие отказы переживает подтверждённый результат.

  • База не угадывает правила продажи. Ограничения и логика операции должны выражать нужное правило: обязательность номера заказа, допустимое количество, связь с покупателем. Транзакция может надёжно сохранить ошибку, если заданные проверки её пропускают.

  • В PostgreSQL CHECK положительности суммы не запрещает NULL: логическое условие считается выполненным и при неизвестном результате. Если сумма обязательна, задайте также NOT NULL. Успешная проверка отрицательного числа ещё не проверяет отсутствие значения.

  • Согласованность ACID относится к правилам данных. Согласованность в CAP — к наблюдаемому порядку распределённых операций. Успешная локальная проверка заказа сама не доказывает, что два разобщённых узла показывают единый актуальный остаток.

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

Модуль 2 из 12

Ответ потерялся — заказ принят или нет?

Клиент отправил подтверждение заказа и получил таймаут. Инженер предлагает повторить запрос. Сначала нужно понять, что известно о прежнем результате и какая операция будет повторена.

  • COMMIT завершает транзакцию фиксацией. Но ответ клиенту может потеряться уже после этого. Таймаут соединения не доказывает откат: нужно выяснить результат конкретной деловой операции или использовать предусмотренный безопасный повтор.

  • Идемпотентность относится к предполагаемому эффекту повторов. Повторное удаление одного и того же ресурса может вернуть другой статус ответа, хотя требуемое состояние «ресурса нет» осталось тем же. Разные ответы сами по себе не доказывают повторное деловое действие.

  • Способ повтора должен охватывать оплату или заказ, которые нельзя выполнить дважды. Свойство HTTP-метода не даёт произвольному обработчику готового хранилища ключей и результатов. Проверяйте контракт конкретного API: область ключа, совпадение запроса и срок распознавания прежней операции.

  • Отсутствие заказа в отстающей реплике не доказывает, что COMMIT основной базы не состоялся. До решения о повторе выясните, какой источник способен показать результат этой операции. Иначе проверка через устаревшую копию сама станет причиной второго заказа.

  • После потерянного ответа проверяйте отказ в двух местах: до фиксации и после неё, но до получения ответа. При повторе клиент должен получить согласованный результат одной операции. Испытание только нормального ответа не проверяет это окно неопределённости.

Модуль 3 из 12

Какой остаток видит запрос?

Два менеджера работают с одной базой. Пока один проверяет остаток, другой меняет его. Теперь одного успешного SQL-запроса мало: значение зависит от момента снимка и выбранной изоляции.

  • Грязное чтение использует ещё не зафиксированное изменение другой транзакции. Если та откатится, решение уже опиралось на несуществующий итог. В PostgreSQL 18 режим Read Uncommitted работает как Read Committed и такого чтения не разрешает.

  • В PostgreSQL Read Committed два обычных SELECT могут видеть разные зафиксированные версии одной строки: каждый получает новый снимок. Это неповторяемое чтение. Если по прежнему условию появился новый набор подходящих строк, речь о фантомном чтении.

  • MVCC позволяет запросу читать подходящие версии строк. Обычное чтение не обязано ждать каждую конкурентную запись, но явные блокировки и операции изменения структуры имеют отдельные правила. Само наличие MVCC не выбирает за приложение нужный уровень изоляции.

  • Снимок транзакции задаёт видимость данных, а не сохраняет резервную копию. В PostgreSQL Read Committed снимок относится к команде, Repeatable Read — к транзакции; важен момент получения снимка. Собственные изменения транзакции рассматриваются отдельно от видимости чужих фиксаций.

  • В PostgreSQL Repeatable Read один BEGIN ещё не фиксирует снимок читаемых данных. Он появляется при первой команде, не управляющей самой транзакцией. Фиксация другого сеанса между BEGIN и первым чтением может попасть в этот снимок; последующие чужие фиксации уже не делают старый снимок свежим.

  • Отсутствие фантомов не равно сериализуемости. PostgreSQL Repeatable Read сохраняет снимок и не показывает новые чужие строки внутри транзакции, но совместный итог нескольких транзакций ещё может нарушить правило, которое ни одна из них не нарушала в одиночку.

Модуль 4 из 12

Два правильных заказа нарушили общий предел

У покупателя кредитный предел 100 условных единиц. Два менеджера одновременно оформляют по 70. Каждый видит нулевую сумму и проходит свою проверку. Нужно защитить общее правило, а не только отдельные строки.

  • При одном исходном состоянии две транзакции могут каждая разрешить заказ на 70 и вставить разные строки. Общая сумма станет 140 при пределе 100. Если выполнять те же проверки последовательно, второй заказ не прошёл бы: это пример аномалии сериализации, а не грязного чтения.

  • Сериализуемость требует результата, эквивалентного некоторому последовательному исполнению принятых транзакций. Она не требует физически выполнять всё по одной операции и не обещает отсутствие отказов с требованием повтора.

  • После ошибки сериализации PostgreSQL приложение повторяет всю транзакцию вместе с чтением данных и выбором дальнейших действий. Повтор одного последнего UPDATE со старым решением не выполняет заново проверку кредитного предела.

  • Для одного существующего остатка отдельным решением может быть условное уменьшение самой строки. В PostgreSQL Read Committed UPDATE после ожидания конкурента повторно проверяет условие на новой версии строки. Приложение должно учесть ноль изменённых строк; этот приём не доказывает правило по сумме разных заказов.

  • Линеаризуемость отдельных операций объекта и сериализуемость многооперационных транзакций сравнивают с учётом их границ. Первая связывает операцию с реальным порядком вызовов и ответов; вторая — совместный эффект транзакций с последовательным исполнением. Название одного свойства не доказывает другое для всей заявки.

  • Повторная транзакция базы не должна незаметно повторять внешний платёж. Отделите действия внутри повторяемой границы от внешних эффектов, чей итог уже мог быть принят. Защита от конкурентной аномалии и защита от повторного списания решают разные задачи.

Модуль 5 из 12

Что сохранено к моменту подтверждения?

Заказ принят, но сервер потерял питание. Заказчик ожидает, что подтверждённая запись вернётся. Разберите путь журнала и страниц данных и назовите настройки, от которых зависит это ожидание.

  • WAL записывает сведения об изменениях до соответствующих страниц данных. При восстановлении после аварии PostgreSQL может воспроизвести необходимую работу по журналу. Подтверждение транзакции поэтому не требует немедленно переписать каждую изменённую страницу на её основное место.

  • Долговечность проверяют для заданного отказа и настроек подтверждения. Успешный ответ базы нельзя отделять от режима сброса журнала и способности тракта хранения выполнять обещание устойчивой записи. Локальный ответ не описывает автоматически сохранность на другой машине.

  • В PostgreSQL отключение ожидания синхронной фиксации и отключение fsync меняют разные условия. При synchronous_commit=off последние подтверждённые транзакции могут потеряться после аварии; fsync управляет требованием устойчивого сброса. Не переносите результат проверки одной настройки на другую.

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

  • Сравнивайте результаты испытаний с точной границей: потеря процесса базы, авария ОС, потеря питания, утрата накопителя или площадки. Название WAL само не доказывает, что одна локальная копия покрывает все эти события.

Модуль 6 из 12

Какого ответа ждать от реплики?

В проект добавили резервный сервер. Теперь нужно выбрать, какой удалённый этап входит в подтверждение заказа и что произойдёт при потере связи с обязательной репликой.

  • При асинхронной потоковой репликации PostgreSQL основная база не ждёт удалённого подтверждения перед своим ответом. Локальная долговечность остаётся отдельным условием. Поэтому само наличие реплики не исключает потерю последних подтверждённых изменений при утрате основной машины.

  • Слово «синхронная» требует уточнить выбранный этап. В PostgreSQL remote_write ждёт записи на стороне реплики, но не гарантирует сохранение её буферов после аварии ОС. Ожидание устойчивого сброса и remote_apply задают более поздние точки; последняя включает применение изменений.

  • Укажите обязательные реплики и правило их выбора. Если требуемого подтверждения нет, соответствующая фиксация может ждать. Убрать это ожидание ради короткого ответа — значит изменить контракт сохранности; такую операцию нельзя незаметно считать прежней гарантией.

  • Удалённое ожидание добавляет зависимость от связи и выбранной реплики. Размещение влияет и на задержку, и на общие отказы. Проверяйте точный состав подтверждения вместе с площадками; количество серверов само не доказывает независимость их питания и сети.

  • remote_apply подтверждает применение, но не обновляет уже открытый старый снимок читателя. После подтверждения проверяйте чтение с подходящей видимостью. Старая транзакция Repeatable Read может продолжить видеть прежний остаток без нового отставания применения.

Модуль 7 из 12

Отставание ещё не означает потерю

Основная машина недоступна. Реплика показывает старый остаток. Перед переключением разделите содержимое её устойчивого журнала, уже применённые изменения и историю, которую ещё можно получить из другого источника.

  • Прогресс репликации измеряют по разным этапам: передаче, записи, устойчивому сбросу и применению. Старый результат SELECT может означать задержку применения или старый снимок. Одно число отставания не устанавливает, на каком этапе задержался заказ.

  • Устойчиво полученный, но ещё не применённый WAL не следует сразу записывать в потерянные данные. Он может позволить довести реплику до более позднего состояния. Для выбранного восстановления отдельно проверьте доступный журнал, его целостность и применимую историю.

  • Если нужной части WAL нет на реплике, выясните, сохранилась ли она в архиве или на другом пригодном источнике. Возможная потеря определяется недоступной для выбранного восстановления подтверждённой историей, а не одной текущей позицией применения.

  • Поля write_lag, flush_lag и replay_lag PostgreSQL отражают измеренную задержку подтверждения этапов. NULL после периода без активности не является доказательством нулевого отставания. Эти поля также не обещают время, за которое реплика догонит базу после нового всплеска.

  • Удержание WAL для отставшей реплики расходует место. В PostgreSQL слот репликации помогает сохранить нужную историю, но не создаёт бесконечный накопитель. До длительного отказа реплики проверьте удерживаемый объём, ограничения и порядок восстановления отставшего узла.

Модуль 8 из 12

Кто вправе принять новую запись?

Часть узлов видит друг друга, часть изолирована. Наличие копии заказа не отвечает на вопрос, может ли эта часть системы принять следующий заказ. На модели Raft разберите голоса и этапы записи.

  • В модели Raft узлы согласуют упорядоченный журнал, который затем применяет машина состояний. Голосующее большинство нужно для принятия новых записей по правилам протокола. Речь о модели отказов без произвольного злонамеренного поведения, а не о любом способе распределённого согласования.

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

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

  • В Raft недостаточно посчитать любые копии записи прежнего срока лидера. Для продвижения фиксации подсчётом реплик действует правило текущего срока; фиксация нужной текущей записи связывает и предшествующий журнал. Номер записи без срока и состояния протокола не доказывает принятое решение.

  • Если два из трёх голосующих узлов находятся на одной площадке, потеря этой площадки оставляет только один голос. Копия на третьем сервере может существовать, но большинства для новых решений нет. Сверяйте размещение голосов с отказом, который обещан заказчику.

Модуль 9 из 12

Какую свежесть обещает чтение?

Клиент получил подтверждение изменения остатка и сразу открыл другой экран. Тот прочитал прежнее значение через соседний узел. Определите, противоречит ли это обещанному порядку, и что система должна делать при разрыве связи.

  • Линеаризуемая операция выглядит совершившейся в одной точке между вызовом и ответом. Если запись уже завершилась до начала чтения и новых записей нет, чтение того же объекта должно учитывать её результат. Одновременно идущие операции допускают порядок в пределах своих перекрывающихся интервалов.

  • Линеаризуемость отдельных обращений ещё не делает атомарной последовательность «прочитать остаток, проверить, уменьшить». Для общего заказа нужны соответствующие граница и протокол транзакции. Упорядоченный доступ к одной строке и защита всего правила продажи — разные требования.

  • В модели CAP C означает линеаризуемость; при разделении сети её нельзя гарантировать одновременно с доступностью A. В формальной модели CAP доступность означает, что каждый запрос к неотказавшему узлу в итоге получает ответ. Числового предела задержки это определение не задаёт. Какие ответы допустимы, задаёт спецификация операции: нельзя ни приравнивать формальную доступность к успешной покупке, ни считать произвольную ошибку корректным результатом чтения регистра.

  • CAP не предлагает постоянно выбирать любые две буквы. PACELC отдельно рассматривает поведение при разделении и обмен задержки на согласованность при обычной связи. Для проекта важны конкретная операция, путь чтения и обязательное удалённое ожидание, а не одна наклейка на продукте.

  • Если подтверждение новой записи должно дождаться удалённого узла, время доставки запроса и обратного ответа входит в этот путь. Увеличение CPU не устраняет заданную задержку связи. Убирая удалённое ожидание, перепроверьте гарантию этой операции, а не только полученную скорость.

Модуль 10 из 12

Сообщение обработано — оплата проведена один раз?

Заказ отправлен в очередь оплаты. Потребитель успел списать деньги, но завершился до сохранения позиции. После перезапуска он получил то же событие. Проверять нужно итог платежа вместе с положением обработки.

  • Разделите публикацию, доставку, выполнение кода и деловой эффект. Подтверждение брокера не доказывает списание денег. Порядок событий в одном разделе также не обеспечивает автоматически общий порядок всех заказов или отсутствие повторного внешнего действия.

  • У производителя Kafka acks задаёт ожидаемое подтверждение. acks=0 не ждёт ответа брокера; acks=1 ждёт записи в журнал лидера, но не копии у последователей; acks=all ждёт весь текущий ISR — синхронизированные реплики, включая лидера. Для acks=0/1 здесь задан нетранзакционный производитель с enable.idempotence=false. Отказ лидера после acks=1 и до копирования может потерять подтверждённое сообщение. Подтверждение брокера не доказывает платёж.

  • При acks=all min.insync.replicas задаёт минимум текущего ISR для успешной записи. Если минимум равен двум, одного лидера недостаточно; при текущем ISR из трёх реплик acks=all ждёт все три, а не ровно две. Число назначенных реплик, текущий ISR и минимум — разные величины. При acks=1 этот минимум не превращает ответ лидера в ожидание копий. Подтверждение репликации также не означает обязательный fsync записи на каждом накопителе.

  • При сохранении позиции до выполнения эффекта сбой может оставить действие невыполненным без повторной обработки. При эффекте до сохранения позиции возникает окно повторного выполнения. Обещание доставки «не менее одного раза» допускает повтор и само не делает внешний платёж однократным.

  • enable.auto.commit=true включает периодическую фиксацию позиций; auto.commit.interval.ms задаёт интервал, по умолчанию 5000 мс. Если приложение передало платёж отдельному обработчику и продолжает poll, позиция может быть сохранена до эффекта. Проверяйте фактический успешный commit, а не только истечение интервала. enable.auto.commit=false отключает автоматику, но ручной commit до эффекта допускает пропуск, а после эффекта — повтор при сбое между ними. Ни один режим сам не делает оплату атомарной.

  • Идемпотентный производитель Kafka устраняет определённые дубли отправки в своём протоколе. Он не мешает потребителю второй раз вызвать платёжный API после сбоя. Для внешнего результата нужна защита, охватывающая ту же деловую операцию и её повтор.

  • В транзакционном пути Kafka выходные записи и позиции потребителя можно фиксировать вместе. Получатели с read_committed не читают отменённые транзакционные записи. Этот охват нужно сохранить в конфигурации и жизненном цикле производителя; произвольная внешняя база или платёж туда автоматически не включается.

  • Обработка без повторного принятого результата не означает, что код физически вызван один раз. Повтор после отказа может снова выполнить вычисления. Приёмка должна считать подтверждённые эффекты на нужной границе, а не только число входов в обработчик.

Модуль 11 из 12

Кто решает судьбу подготовленной транзакции?

Заказ и его отражение в другой базе участвуют в распределённой операции. Один участник сообщил о подготовке, после чего координатор пропал. Состояние «готов выполнить решение» нельзя принять за окончательный успех.

  • Двухфазная фиксация разделяет подготовку участников и окончательное решение координатора. Подготовленный участник ещё не равен зафиксированной деловой операции. Состояние нужно связать с общей транзакцией и её принятым решением.

  • В PostgreSQL подготовленная транзакция может пережить завершение исходного сеанса. Её работа уже завершена до решения COMMIT PREPARED или ROLLBACK PREPARED; продолжить в ней обычные изменения, как в открытом клиентском блоке, нельзя.

  • Подготовленное состояние удерживает блокировки и может мешать очистке старых версий. Увеличение памяти не разрешает оставленный без хозяина исход. Нужны наблюдение подготовленных транзакций, ответственный менеджер и восстановление его решения.

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

Модуль 12 из 12

Восстановилась база — восстановился заказ?

Ошибочный DELETE попал и в основную базу, и в реплику. Нужно вернуться до ошибки, уложиться в срок и снова обслуживать заказы. При этом платёжная система сохранила реальные списания, сделанные после выбранной точки.

  • Репликация может перенести ошибочное удаление на вторую копию. Само наличие реплики не сохраняет подходящую точку до ошибки. Нужны материалы, из которых можно восстановить требуемое прежнее состояние, и проверенная процедура такого возврата.

  • Набор материалов зависит от метода. Для PostgreSQL восстановления по архиву WAL нужны подходящая базовая копия и непрерывная необходимая история журнала. Этот способ не является определением всякого восстановления базы; другие методы проверяют по их собственному контракту.

  • Цель должна предшествовать ошибке, если задача — отменить её результат. Уточните время, транзакцию или позицию и ветвь истории после прежних переключений. Журнал после ошибочного DELETE может честно воспроизвести само удаление; наличие более поздних материалов ещё не выбирает правильную цель.

  • Запущенный процесс базы не доказывает приёмку. Зафиксируйте использованные материалы, достигнутую точку, фактическое время и результат проверки приложения. Для заказа проверьте состав, остаток и возможность выполнить предусмотренную операцию клиента.

  • Возврат своей базы не отменяет уже проведённый внешний платёж. Восстановленная позиция обработки может заново выдать старую работу. До возобновления согласуйте деловые операции с сохранившимися внешними результатами; один успешный SQL-запрос не закрывает этот риск.

Финишная прямая

Проверьте инженерное мышление

Вопросы проверяют не память на аббревиатуры, а умение не делать лишних выводов.

01Приложение уменьшило остаток и создало заказ в одной транзакции БД. Затем независимый платёжный API провёл списание. После ошибки приложение выполнило полный ROLLBACK; платёжная система в транзакции не участвовала. Каков итог?
02В PostgreSQL 18 у числового поля суммы есть только CHECK на положительность. NULL допускается типом столбца; других ограничений и триггеров нет. Отклонит ли этот CHECK строку без суммы?
03Клиент не получил ответ на COMMIT. Запрос к асинхронной реплике не нашёл заказ; её свежесть относительно этой операции неизвестна. Можно ли на этом основании считать прежний заказ отменённым и создать новый?
04Первый DELETE удалил один ресурс и вернул 204. Повтор того же запроса вернул 404, потому что ресурса уже нет; другие участники его не создавали заново. Нарушает ли различие ответов идемпотентность предполагаемого эффекта?
05В PostgreSQL 18 транзакция A на Read Committed дважды читает цену одной строки. Между чтениями B меняет цену и выполняет COMMIT. A видит сначала 100, затем 120. Как называется наблюдённая аномалия?
06В PostgreSQL 18 A выполнила BEGIN с Repeatable Read и ещё не читала и не меняла данные. Затем B зафиксировала новую цену. После этого A делает первый обычный SELECT этой строки. Других операций нет. Какая версия попадёт в снимок A?
07Кредитный предел — 100, заказов пока нет. Две транзакции на PostgreSQL Repeatable Read видят сумму 0; каждая проверяет предел и вставляет отдельный заказ на 65. Общая сумма ничем дополнительно не защищена. Обе фиксируются. Совместим ли итог с последовательным выполнением тех же проверок?
08Транзакция прочитала заказы, рассчитала доступный кредит и попыталась создать новый заказ. PostgreSQL вернул ошибку сериализации. Как построить повтор, чтобы снова проверить принятое решение?
09PostgreSQL подтвердил транзакцию после требуемого устойчивого сброса WAL. Изменённые страницы ещё не записаны на основные места. Произошёл аварийный останов; нужный журнал и накопитель сохранились исправными. Делает ли незаписанность этих страниц потерю транзакции неизбежной?
10В PostgreSQL fsync включён, но для заказов выбран synchronous_commit=off. Клиент получил успешный ответ, и сразу произошла авария ОС. Какое обещание о последних подтверждённых заказах было бы неверным?
11Приёмка требует сохранить заказ при утрате основной машины и аварии ОС выбранной реплики с потерей несброшенных буферов. Подтверждение настроено на remote_write. Закрывает ли сам этот удалённый этап заявленное требование?
12Заказ подтверждён с remote_apply на выбранной реплике. На ней транзакция Repeatable Read получила снимок до заказа и продолжает читать прежнее состояние. Новых собственных изменений у неё нет. Доказывает ли такое чтение нарушение remote_apply?
13Основная PostgreSQL-база утрачена. На реплике нужный WAL с подтверждённым заказом устойчиво сохранён и исправен; принадлежность выбранной истории проверена. Применение пока не дошло до заказа. Потерян ли заказ только потому, что текущий SELECT его не показывает?
14После периода без записей монитор PostgreSQL показывает replay_lag=NULL. Инженер записал в отчёт: «Реплика не отстаёт, новый всплеск применится за ноль секунд». Как оценить этот вывод по одному полю?
15Неизменный состав Raft — пять голосующих узлов. Разделение сети оставило две изолированные группы по три и два узла. Внутри каждой связь исправна. Какой группе хватает голосов для новых решений при выполнении остальных правил протокола?
16Новый лидер Raft обнаружил, что запись прежнего срока присутствует на большинстве узлов. Записи своего срока он ещё не зафиксировал. Достаточно ли одного подсчёта этих старых копий, чтобы объявить ту запись зафиксированной?
17На двух разобщённых узлах каждая локальная транзакция соблюдает ограничения своей базы. Оба узла продолжают успешно принимать конфликтующие изменения одного объекта и показывать несовместимые значения. Доказывает ли соблюдение локальных правил согласованность C в CAP?
18У регистра остатка начальное значение 8. Запись значения 5 успешно завершилась; затем началось чтение того же регистра. Других записей и внешних откатов нет. Чтение вернуло 8. Совместим ли такой результат с обещанной линеаризуемостью?
19Потребитель Kafka успешно вызвал внешний платёжный API и завершился до сохранения позиции. После перезапуска сообщение пришло повторно. API не распознаёт прежнюю операцию. Идемпотентный производитель включён. Исключает ли он второе списание?
20Потребитель Kafka записал результат в выходной топик и позиции входного чтения в одну Kafka-транзакцию. Транзакция отменена. Другой потребитель читает выход с read_committed. Должен ли он получить эти отменённые транзакционные записи как результат обработки?
21Нетранзакционный производитель Kafka 4.0 использует enable.idempotence=false и acks=1. У раздела три назначенные реплики и min.insync.replicas=2. Лидер подтвердил запись, затем был утрачен до её копирования. Других копий этой записи нет. Как оценить выбранную защиту от потери?
22Потребитель Kafka 4.0 с enable.auto.commit=true передал задание оплаты отдельному обработчику и продолжил poll. Автофиксация успешно сохранила позицию после задания. Процесс упал до первого вызова платёжного API. После запуска группа читает с сохранённой позиции, без перемотки или повторной отправки задания. Каков результат такого возобновления?
23PostgreSQL успешно выполнил PREPARE TRANSACTION для операции заказа. Исходный клиентский сеанс завершился. Решение координатора ещё не получено. Завершение сеанса само откатило эту подготовленную транзакцию?
24Участник общей транзакции находится в подготовленном состоянии. Координатор недоступен; администратор знает только, что ожидание превысило пять минут. Сведения об окончательном решении и исходах других участников отсутствуют. Даёт ли один этот таймаут основание выбрать локальный откат?
25Ошибочный DELETE зафиксирован в PostgreSQL и применён на реплике. Требуется восстановиться до удаления методом PITR по архиву WAL. Достаточно ли одной текущей реплики, на которой удаление уже видно?
26База заказов успешно восстановлена на 10:00 до ошибочного удаления. Независимая платёжная система сохранила реальное списание в 10:05. Проверка запуска БД прошла. Какой вывод о платеже и возобновлении обработки обоснован этими условиями?
Проверяемая база

Источники курса

Ссылки приведены один раз для всего курса, чтобы не мешать чтению каждого тезиса.

  • Первичная публикация

    The Transaction Model — Turing Award Lecture

    Microsoft Research / ACM · Jim Gray, FCRC 1999 lecture slides

    Первичный обзор transaction model, ACID, concurrency anomalies, logs и two-phase commit.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Transactions

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить границы BEGIN/COMMIT/ROLLBACK, отдельные транзакции без BEGIN, точки сохранения и оговорку о поведении клиентских библиотек.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: PREPARE TRANSACTION

    PostgreSQL Global Development Group · PostgreSQL 18 SQL command reference

    Описывает prepared transaction, external transaction manager и operational risk forgotten prepared state.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Transaction Isolation

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.2

    Определяет isolation phenomena и фактическое поведение PostgreSQL levels, включая Serializable.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Write-Ahead Logging

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 28.3

    Определяет write-ahead rule, REDO crash recovery и роль checkpoint.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Log-Shipping Standby Servers

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 26.2

    Фиксирует async default, synchronous commit wait points и связь replication delay с data loss.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Constraints

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить CHECK и NULL, NOT NULL, UNIQUE и границу проверок одной строки; пример заказа — редакторское применение этих правил.

    Открыть первоисточник
  • Первичная публикация

    Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services

    MIT Laboratory for Computer Science · Gilbert and Lynch, SIGACT News 33(2), 2002

    Формализует CAP impossibility для atomic consistency и availability в asynchronous network model.

    Открыть первоисточник
  • Первичная публикация

    Linearizability: A Correctness Condition for Concurrent Objects

    Carnegie Mellon University / ACM · Herlihy and Wing, ACM TOPLAS 12(3), July 1990

    Даёт формальное real-time correctness condition для concurrent operations.

    Открыть первоисточник
  • Первичная публикация

    In Search of an Understandable Consensus Algorithm (Extended Version)

    Stanford University / USENIX · Ongaro and Ousterhout, USENIX ATC 2014 extended paper

    Первичное описание Raft: leader election, replicated log, commit majority и safety.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Continuous Archiving and Point-in-Time Recovery

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 25.3

    Связывает base backup, непрерывный WAL archive и проверяемый recovery target.

    Открыть первоисточник
  • Первичная спецификация

    Intel 64 and IA-32 Architectures Software Developer Manuals

    Intel · Version 092, обновлено 19 августа 2026 года

    Официальное описание архитектуры, программной модели и полного набора инструкций Intel 64 и IA-32.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: WAL Configuration

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить fsync, synchronous_commit=off/on/remote_write/remote_apply и условия ожидания синхронных реплик.

    Открыть первоисточник
  • Первичная спецификация

    HTTP Semantics

    Internet Engineering Task Force · RFC 9110, June 2022

    Определяет stateless HTTP, origin server, intermediaries, target URI и security significance полей authority и Host.

    Открыть первоисточник
  • Официальная документация

    Stripe API Reference: Idempotent requests

    Stripe · справочник Stripe API, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить POST с ключом идемпотентности: параметры, сохранение ответа после начала выполнения и удаление ключей не раньше 24 часов.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Introduction to MVCC

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.1

    Объясняет multiversion snapshots и границу между MVCC и explicit locking.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Explicit Locking

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить блокировки строк SELECT FOR UPDATE, ожидание конкурирующих изменений и срок удержания до конца транзакции.

    Открыть первоисточник
  • Официальная документация

    Snapshot — CSRC Glossary

    National Institute of Standards and Technology · CSRC glossary по NIST SP 800-125, проверено 29 августа 2026 года

    Определяет snapshot как запись состояния running image, обычно в виде differences между image и current state.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Reliability

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить выполнение сброса всем трактом хранения, энергозависимые кэши накопителя и контроллера и границы гарантии при потере питания.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Replication

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить synchronous_standby_names, FIRST/ANY и удержание WAL слотами.

    Открыть первоисточник
  • Официальная документация

    Restore testing

    Amazon Web Services · AWS Backup Developer Guide, проверено 30 августа 2026 года

    Описывает периодический real restore, измерение duration, отдельный test account и optional validation до удаления test resources.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: The Cumulative Statistics System

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить pg_stat_replication: позиции LSN, write_lag/flush_lag/replay_lag, NULL после простоя и отсутствие прогноза догоняния.

    Открыть первоисточник
  • Первичная публикация

    Consistency Tradeoffs in Modern Distributed Database System Design

    Yale University / IEEE Computer · Daniel Abadi, IEEE Computer 45(2), 2012

    Вводит PACELC: partition tradeoff и отдельный normal-operation latency/consistency tradeoff.

    Открыть первоисточник
  • Официальная документация

    Security Guidelines for Storage Infrastructure

    National Institute of Standards and Technology · NIST SP 800-209, October 2020

    Разделяет backup, replication, immutability, continuous data protection и point-in-time copies; описывает synchronous и asynchronous replication.

    Открыть первоисточник
  • Официальная документация

    Recovery Point Objective — CSRC Glossary

    National Institute of Standards and Technology · CSRC glossary по NIST SP 800-34 Rev. 1, проверено 29 августа 2026 года

    Определяет RPO как точку во времени, до которой данные должны быть восстановлены после outage.

    Открыть первоисточник
  • Первичная публикация

    Time, Clocks, and the Ordering of Events in a Distributed System

    Microsoft Research / ACM · Leslie Lamport, CACM 21(7), July 1978

    Определяет happens-before, logical clocks и связь total ordering со replicated state machine.

    Открыть первоисточник
  • Официальная документация

    Apache Kafka 4.0 Design

    Apache Software Foundation · Apache Kafka 4.0 documentation

    Определяет log ordering, producer idempotence, delivery semantics и scope exactly-once processing.

    Открыть первоисточник
  • Официальная документация

    Apache Kafka 4.0: Producer Configs

    Apache Software Foundation · документация Apache Kafka 4.0, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить transactional.id, связь с enable.idempotence и продолжение транзакционного протокола между сеансами производителя.

    Открыть первоисточник
  • Официальная документация

    Apache Kafka 4.0: Consumer Configs

    Apache Software Foundation · документация Apache Kafka 4.0, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить isolation.level=read_committed, last stable offset и задержку чтения из-за незавершённых транзакций.

    Открыть первоисточник
  • Официальная документация

    Plan and Perform Restore Sequences for Full Recovery Model

    Microsoft · SQL Server 2016–2025 documentation, проверено 30 августа 2026 года

    Задаёт точную restore sequence: база, выбранный differential и последующие log backups в порядке до recovery target.

    Открыть первоисточник
  • Официальная документация

    Recovery Time Objective — CSRC Glossary

    National Institute of Standards and Technology · CSRC glossary по NIST SP 800-34 Rev. 1, проверено 29 августа 2026 года

    Определяет RTO как допустимую длительность recovery phase до ущерба mission/business process.

    Открыть первоисточник
Сообщить об ошибке

Опишите проблему — постараемся исправить как можно скорее.

Спасибо!

Получили ваше сообщение.
Подтвердите действие