Получение на самом деле не является «транзакционным»; если транзакция содержит только чтение, то фиксация транзакции на самом деле ничего не делает. Выполнение чтения в транзакции гарантирует только одно: если значение, возвращенное чтением, больше не является самым последним значением во время применения любых записей в транзакции, транзакция будет прервана и ничего записей произойдет.
Итак, возможна следующая последовательность событий:
- Начать транзакцию 1.
- Внутри транзакции 1 вы читаете объект A, и он возвращает состояние A1.
- Внутри транзакции 1 вы обновляете объект A с состояния A1 до состояния A2.
- При фиксации транзакции 1 происходит сбой с одним из упомянутых исключений.
- Начать транзакцию 2.
- Внутри транзакции 2 вы читаете объект A, и он возвращает состояние A1.
- Транзакция 1 применяется к хранилищу данных в фоновом режиме, изменяя A из состояния A1 в состояние A2.
- Завершить транзакцию 2 (без фиксации, так как не было записи).
Но эта последовательность событий иная:
- Начать транзакцию 1.
- Внутри транзакции 1 вы читаете объект A, и он возвращает состояние A1.
- Внутри транзакции 1 вы обновляете объект A с состояния A1 до состояния A2.
- При фиксации транзакции 1 происходит сбой с одним из упомянутых исключений.
- Начать транзакцию 2.
- Внутри транзакции 2 вы читаете объект A, и он возвращает состояние A1.
- Внутри транзакции 2 вы обновляете объект A с состояния A1 до состояния A3.
- Транзакция 1 применяется к хранилищу данных в фоновом режиме, переводя A из состояния A1 в состояние A2.
- Транзакция 2 теперь не будет успешно зафиксирована, потому что запись, которую она собирается применить, основана на устаревшей версии объекта A. Она завершится ошибкой, и A останется в состоянии A2.
Итак, добавив к вопросу шаг 4, вы попадаете во вторую последовательность событий. Возможно, что get на шаге 3 вернет None, хотя сущность действительно существует, но в этом случае невозможно для успешной последующей записи: транзакция устарела и, следовательно, не может быть зафиксирована. Транзакция будет повторена, и во второй раз get вернет объект, записанный на шаге 1, что вы и хотели.
Итак, очень короткий ответ: да, он может вернуть устаревшее значение, но гарантировано, что если результат был устаревшим, последующая запись в этот объект в той же транзакции завершится ошибкой, поэтому этого не должно быть. на самом деле вызвать проблему.
person
Torne
schedule
13.06.2013