Django:在一个事务中多个批量创建

时间:2019-02-26 10:03:21

标签: django python-3.x django-rest-framework

我想在一个事务中进行多个批量创建(独立)。

            with transaction.atomic():
                if x:
                   X.objects.bulk_create(x_objs)
                if y:
                    Y.objects.bulk_create(y_objs)
                if z:
                    Z.objects.bulk_create(z_objs)


现在,如果Y或Z失败,我希望X回滚。我该怎么办?

1 个答案:

答案 0 :(得分:0)

通常,如果transaction.atomic()块中发生异常,则事务应该已经回滚。

如果您需要rollback来处理更复杂的用例,则可以手动进行:

        with transaction.atomic():
            if x:
               X.objects.bulk_create(x_objs)
            try:
                if y:
                    Y.objects.bulk_create(y_objs)
                if z:
                    Z.objects.bulk_create(z_objs)
            except Exception: # Your exception
                transaction.rollback()

尽管通常情况下,您不应该在atomic()块中自己捕获异常,否则将无法按预期工作。

  

退出原子块时,Django会检查它是正常退出还是有异常退出,以确定是提交还是回退。如果您在一个原子块内捕获并处理异常,则可以向Django隐藏发生问题的事实。这可能会导致意外行为。