Я не понимаю точное поведение Django перед ошибками сериализации базы данных в транзакциях.Каковы режимы сбоя transaction.atomic()?
Документы transaction.atomic()
docs не указывают это поведение, насколько я могу судить.
Если БД попадает на ошибку согласованности при совершении транзакции (например, другая транзакция обновила значение, которое было прочитано в текущей транзакции), считая, что транзакция будет отката, и будет вызвана ошибка DatabaseError. вызывающий код (например, диспетчер контекста transaction.atomic()). Это верно?
И, что еще более важно, существуют случаи, когда транзакция может быть отменена без транзакции.
(Обратите внимание, что я не спрашиваю об ошибках DatabaseErrors, которые вызваны внутри диспетчер контекста, так как документы четко объясняют, что с ними происходит. Я спрашиваю только о ошибках базы данных, которые возникают при совершении транзакции , который возникает при выходе из контекстного менеджера.)
Таким образом, последующий вопрос - если вы всегда получите исключение, почему мы должны 'transaction.on_commit()', который был добавлен в Django 1,9? Похоже, мы всегда могли сказать 'try:, за исключением DatabaseError: else: ' –
Symmetric
'on_commit' работает для всех транзакций, а не только для атомных. – solarissmoke