在原子块中捕获Django ORM错误是否可以?

时间:2017-06-12 17:36:19

标签: django orm transactions atomic

示例代码:

with transaction.atomic():
    # Create and save some models here

    try:
        model_instance.save()
    except IntegrityError:
        raise SomeCustomError()

两个问题:

1)如果除了重新引发自定义错误之外没有在异常处理程序中执行任何操作,那么这是否会按预期工作并回滚任何以前保存的模型?

2)从代码风格的角度来看,在try块中不使用嵌套事务是否有意义? (也就是说,try块中只有一行代码,无意在事务中保留任何其他内容,不会在异常处理程序内写入数据库等)。

2 个答案:

答案 0 :(得分:1)

如果除了重新引发自定义错误之外没有在异常处理程序中执行任何操作,那么这是否会按预期工作并回滚任何以前保存的模型?

是。回滚将由异常(任何异常)触发,只要您在数据库错误后没有触及数据库,您就不会冒风险提及文档中提到的TransactionManagementError

从代码风格的角度来看,在这种情况下,不在try块中使用嵌套事务是否有意义?

风格是一个意见问题,但我在这里看不到使用嵌套交易的任何意义。它使代码更复杂(更不用说事务中不必要的保存点),没有明显的好处。

答案 1 :(得分:0)

您应该使用如下代码的原子事务。处理catch块中的原子事务,避免在原子内捕获异常。

try:
    with transaction.atomic():
        SomeModel.objects.get(id=NON_EXISTENT_ID)
except SomeModel.DoesNotExist:
    raise SomeCustomError()