【问题标题】:Python + SQLAlchemy problem: The transaction is inactive due to a rollback in a subtransactionPython + SQLAlchemy 问题:由于子事务中的回滚,事务处于非活动状态
【发布时间】:2011-03-09 12:39:44
【问题描述】:

我遇到了 Python + SQLAlchemy 的问题。

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

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

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

最好的方法是什么?有没有办法告诉 Python 回滚失败的事务?

【问题讨论】:

    标签: python sqlalchemy pylons


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      你可以看看 Handle mysql restart in SQLAlchemy

      您还可以在 BaseController 中捕获 SA 异常 try-finally 并执行 session rollback()

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

      【讨论】:

      • 哦,谢谢,我现在看到会话在每次请求后都被删除()。那为什么后面的所有请求都会出现错误呢?
      • 是的,差不多。选择、更新……所有请求都失败了。
      • 您的控制器中的 SA Session 对象与 yoursapp.lib.base 中的 Session 对象相同吗?可能是您有一些代码生成 IntegrityError 并在没有 rollback() 的情况下处理它。据我所知,在 IntgerityError 和其他人之后,您必须执行 rollback() 或关闭/删除 SA 会话
      猜你喜欢
      • 2016-06-29
      • 1970-01-01
      • 2011-08-21
      • 2018-02-13
      • 2015-04-13
      • 2021-03-19
      • 1970-01-01
      • 2012-04-04
      • 2020-06-18
      相关资源
      最近更新 更多