sicp.io
3.4.1 · Чередования в разделяемом состоянии

Чередование чтений и записей и потерянное обновление

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

Вопрос для размышления

Что теряется, когда два обновления считывают один и тот же общий баланс до завершения любого из них?

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

Операция deposit прибавляет 10, а операция withdrawal вычитает 20. В первом расписании обе операции считывают 100. Операция deposit записывает 110, однако withdrawal по-прежнему вычисляет результат на основе ранее прочитанного значения и записывает 80. Более поздняя запись заменяет результат операции deposit, поэтому итоговый баланс не содержит обоих изменений.

Второе расписание позволяет операции deposit выполнить чтение и запись до того, как операцию чтения выполнит withdrawal. В результате withdrawal видит 110 и записывает 90. Эти программы перечисляют два выбранных конечных расписания и их точные итоговые балансы.

Код SICP461 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает ((deposit read 100) (withdraw read 100) (deposit write 110) (withdraw write 80) (final 80)). Сериализованная программа возвращает ((deposit read 100) (deposit write 110) (withdraw read 110) (withdraw write 90) (final 90)).

    На что обратить внимание в трассе

    Проследите за двумя начальными чтениями баланса перед каждым присваиванием в первом запуске, затем найдите записи 110 и 80. Во втором запуске чтение в withdrawal следует за записью 110. Трассы выполнения фиксируют оба явных расписания в рамках фиксированных ограничений среды исполнения.

    Попробуйте сами

    Измените программу и сравните результат.

    В первом расписании поместите запись операции withdrawal перед записью операции deposit. Предскажите итоговый баланс и назовите обновление, которое при этом будет потеряно.

    Показать подсказку

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

    Завершить этот урок

    В этой главе пройдено 0 из 21 урока0%