Pylons + SQLAlchemy问题:由于子事务中的回滚,事务处于非活动状态

时间:2010-06-29 09:02:15

标签: python sqlalchemy pylons

我遇到了Pylons + SQLAlchemy的问题。

当出现问题时(在我的情况下,由于竞争条件而导致完整性错误)并且引发​​了数据库错误,所有后续请求都会导致错误:

InvalidRequestError: The transaction is inactive due to a rollback in a subtransaction.  Issue rollback() to cancel the transaction.

虽然我可以防止这个原始错误(竞争条件)发生,但我想要一个更强大的解决方案,我想防止一个错误导致整个应用程序崩溃。

最好的方法是什么?有没有办法告诉Pylons回滚失败的交易?

2 个答案:

答案 0 :(得分:2)

最简单的方法是确保在控制器中开始工作时使用新的SQLAlchemy Session。在/project/lib/base.py中,为BaseController添加一个方法:

def __before__(self):
    model.Session.close()

Session.close()将清除会话并关闭所有打开的事务(如果有)。您希望确保每次使用会话时,当您在控制器中完成工作时,它都会被清除。在控制器处理请求开始时执行此操作将确保它始终被清除,即使线程的先前请求有异常并且存在回滚等待。

答案 1 :(得分:0)

您是否在控制器中使用 yoursapp .lib.base。 BaseController

你可以看一下 Handle mysql restart in SQLAlchemy

此外,您可以在 BaseController try-finally块中捕获SA异常并执行会话回滚()

在BaseController SA会话中删除了http://www.sqlalchemy.org/docs/05/session.html#lifespan-of-a-contextual-session