С годами я привык к более старым методам transaction.commit_on_success и transaction.commit_manually с Django ‹ 1.6. Но теперь с Django 1.6 старый API заменен в основном на transaction.atomic.
После прочтения документации по новому API я все еще не уверен, как следующий код будет зафиксирован в базе данных:
def a_first_function():
with transaction.atomic():
a_second_function_successful()
a_third_function_fails()
def a_second_function_successful():
with transaction.atomic():
do_something()
def a_third_function_fails():
do_something_wrong()
В этом примере предположим, что a_second_function_successful, вызванная из a_first_function, завершается успешно и создает/сохраняет объекты из моделей. Сразу же после того, как эта функция second_function завершается успешно, вызывается третья функция, которая завершается ошибкой.
Учитывая, что transaction.atomic с использованием контекстного менеджера используется как в первой, так и во второй функции, что произойдет с данными, созданными/измененными в a_second_function_successful. Будет ли он зафиксирован в базе данных? Будет ли откатиться автоматически из первой функции? По моему опыту, вторая функция будет зафиксирована независимо, однако я ожидал, что она не будет зафиксирована.
Будет ли теперь иметь значение, если третья функция будет определена следующим образом:
@transaction.atomic
def a_third_function_fails():
do_something_wrong()
or as:
def a_third_function_fails():
with transaction.atomic():
do_something_wrong()
Спасибо,