Django transaction.commit_on_success-尽管出现错误/异常,提交仍在进行,那么如何调试?

Django transaction.commit_on_success-尽管出现错误/异常,提交仍在进行,那么如何调试?,django,django-models,transactions,django-orm,Django,Django Models,Transactions,Django Orm,使用Django 1.3和PostgreSQL 9.0,我有一个多步骤的对象创建函数/视图,其中: 创建主对象(尝试了MyModel.objects.create()和手动使用object.save()方法),然后 然后设置m2m关系(它们必须遵循主对象创建,以便所述对象具有要关联的id) 其中一些关系可能会失败,或者可能出现其他问题,因此我需要整个函数以原子方式运行 我尝试过在成功装饰器上使用transaction.commit_包装函数,也尝试过手动使用commit_(并在函数末尾设置提交点

使用Django 1.3和PostgreSQL 9.0,我有一个多步骤的对象创建函数/视图,其中:

  • 创建主对象(尝试了MyModel.objects.create()和手动使用object.save()方法),然后
  • 然后设置m2m关系(它们必须遵循主对象创建,以便所述对象具有要关联的id) 其中一些关系可能会失败,或者可能出现其他问题,因此我需要整个函数以原子方式运行

    我尝试过在成功装饰器上使用transaction.commit_包装函数,也尝试过手动使用commit_(并在函数末尾设置提交点);但两者都不起作用。也就是说,主对象被创建并保存在数据库中,即使稍后在函数中引发异常也是如此。礼貌地说,这会使数据库处于不一致的状态。那么,如何调试它呢?我也看到过类似的问题,但它们与使用MySQL有关,而这种中断的事务不应该发生在Postgres上。多年前,Django Trac上就有关于这个问题的罚单,但这些罚单应该已经修复/解决了。能不能请外面的Djangonauts提供一些启示?

    看看这张票:


    我想现在当你得到一个
    IntegrityError
    时,你只需要显式调用
    transaction.rollback()


    如果您正在测试包含事务的代码,则需要使用TransactionTestCase而不是TestCase,否则将导致测试看到您描述的行为。

    @Daniel:不幸的是,这并不容易。如果您知道会干扰事务的事情,请提供建议,谢谢。我发现sqlite的commit_on_成功有时会引入奇怪的行为,并且发现手动commit_无法按预期工作。一定要展示一些受影响的代码,并展示一些错误或测试用例来证明这一点-否则,您将无法在这里得到答案,或者让django开发人员认真对待这一点。谢谢-这看起来至少与我所看到的有关。是的,尽管
    TestCase
    继承自
    TransactionTestCase
    ,但是,这打乱了他父母的交易处理。可以说这是一个合理的特性(as),但它违背了Liskov替换原则。当我第一次遇到它时,我发现它与直觉完全相反。