如何避免跨越方法的“事务托管块以挂起的COMMIT / ROLLBACK”错误结束

时间:2011-10-06 16:26:09

标签: mysql django transactions

我有一种情况,我已经将@ transaction.commit_manually装饰器应用于我导入在http请求响应中传回的信息的方法。我需要根据业务验证规则是通过还是失败来控制提交和回滚。

现在,当我遇到某种验证失败时,我有一个单独的方法,我将错误记录到数据库中。此操作应始终立即提交,同时使主事务处于当前状态。但是,如果我将@ transaction.commit_on_success装饰器应用于错误捕获例程,我的主要事务也会自动提交。如果我不应用@ transaction.commit_on_success装饰器,那么,一旦调用错误捕获例程,我就会收到'Transaction managed block以挂起的COMMIT / ROLLBACK结束'错误。

我正在使用存储引擎INNODB的MYSQL数据库版本5.1.49。

在第二个例程中提交事务时,有没有办法在调用例程中保持open事务?

1 个答案:

答案 0 :(得分:1)

Django的默认事务管理不支持嵌套事务。通常,事务不能嵌套。在事务中完成的所有事情都是提交或回滚的。因此,当您提交事务时,无论您在何处提交事务,它都是原子的。

环顾四周,我发现snippet可能是一个很好的起点。它基本上覆盖了commit_on_success装饰器,添加了一种引用计数形式。从某种意义上说,如果它不是最后一个,它会放弃承诺。