Означает ли долговечность атомарной транзакции Django, что нам не нужны точки сохранения
Атомарная транзакция Django имеет аргументы durable и savepoint. См. docs.
durable=True гарантирует, что атомарный блок является крайним атомарным блоком. Согласно документации:
Иногда полезно убедиться, что атомарный блок всегда является крайним атомарным блоком, что гарантирует фиксацию любых изменений в базе данных при безошибочном выходе из блока. Это называется долговечностью и может быть достигнуто установкой durable=True
.
А PostgreSQL SAVEPOINT устанавливает новую точку сохранения в рамках текущей транзакции. Похоже, что это необходимо только в том случае, если атомарный блок является вложенным.
У меня есть следующие вопросы:
- Если
durable=True, тоsavepointВСЕГДА должен бытьFalse, верно? Потому что нет смысла использовать точку сохранения, если атомный блок является крайним атомным блоком. .
- Если
durable=True, должен ли Django установитьsavepoint=Falseдля нас? Читая исходный код, кажется, что он не делает этого за нас, но мне кажется, что он должен это делать.
Если transaction.atomic(durable=True) вложен в другой transaction.atomic будет выброшен RuntimeError. Я думаю, что у вас не может быть ситуации, когда вы могли бы установить savepoint=False и durable=True (кроме крайних transaction.atomic, в этом случае это не будет точкой сохранения в первую очередь).
Этот пост в блоге может быть полезен.