Что происходит в транзакциях django, если в on_commit возникает ошибка?

Ситуация

У меня есть база данных postgres, и я использую хук on_commit для транзакций , чтобы что-то сделать (в данном случае переместить файл, но для целей вопроса неважно, что именно) после того, как сохранение модели было зафиксировано в базе данных.

from django.db import models, transaction

def my_oncommit_callback():
    # Do something on commit
    raise ValueError("what if I raise an error")

class MyModel(models.Model):
    def save(self, *args, **kwwargs):
        transaction.on_commit(my_oncommit_callback)
        super().save(*args, **kwargs)

Вопрос

Если my_oncommit_callback вызывает ошибку, транзакция откатывается, или я получу нарушенное состояние, потому что моя функция on_commit не сработала так, как ожидалось?

Судя по вашей собственной ссылке в вопросе, в самой документации Django указано

Обратные вызовы вызываются после успешной фиксации открытой транзакции

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

Вернуться на верх