2016-06-01 2 views
2

Я не понимаю точное поведение Django перед ошибками сериализации базы данных в транзакциях.Каковы режимы сбоя transaction.atomic()?

Документы transaction.atomic() docs не указывают это поведение, насколько я могу судить.

Если БД попадает на ошибку согласованности при совершении транзакции (например, другая транзакция обновила значение, которое было прочитано в текущей транзакции), считая, что транзакция будет отката, и будет вызвана ошибка DatabaseError. вызывающий код (например, диспетчер контекста transaction.atomic()). Это верно?

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

(Обратите внимание, что я не спрашиваю об ошибках DatabaseErrors, которые вызваны внутри диспетчер контекста, так как документы четко объясняют, что с ними происходит. Я спрашиваю только о ошибках базы данных, которые возникают при совершении транзакции , который возникает при выходе из контекстного менеджера.)

ответ

0

If the DB hits a consistency error while committing a transaction ... it looks like the transaction will rollback, and the DatabaseError will be raised to the calling code (e.g. the transaction.atomic() context manager). Is this correct?

Да, точно.

Are there cases when the transaction could be rolled back without the transaction.atomic wrapper receiving an exception?

Нет, вы можете проверить это из кода внутри transaction.py, где единственный раз, когда начинается откат, если DatabaseError отбрасывается. Это также подтверждается в documentation, что вы ссылаетесь на:

When exiting an atomic block, Django looks at whether it’s exited normally or with an exception to determine whether to commit or roll back.

+0

Таким образом, последующий вопрос - если вы всегда получите исключение, почему мы должны 'transaction.on_commit()', который был добавлен в Django 1,9? Похоже, мы всегда могли сказать 'try: , за исключением DatabaseError: else: ' – Symmetric

+0

'on_commit' работает для всех транзакций, а не только для атомных. – solarissmoke

Смежные вопросы