我遇到了Pylons + SQLAlchemy的问题。
当出现问题时(在我的情况下,由于竞争条件而导致完整性错误)并且引发了数据库错误,所有后续请求都会导致错误:
InvalidRequestError: The transaction is inactive due to a rollback in a subtransaction. Issue rollback() to cancel the transaction.
虽然我可以防止这个原始错误(竞争条件)发生,但我想要一个更强大的解决方案,我想防止一个错误导致整个应用程序崩溃。
最好的方法是什么?有没有办法告诉Pylons回滚失败的交易?
答案 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