我想在一个事务中进行多个批量创建(独立)。
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回滚。我该怎么办?
答案 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隐藏发生问题的事实。这可能会导致意外行为。