【问题标题】:SQLAlchemy: Keep the session's connection when rolling backSQLAlchemy:回滚时保持会话的连接
【发布时间】:2020-11-18 05:49:18
【问题描述】:

我想在http://arr.gr/blog/2016/05/mysql-named-locks-in-python-context-managers/ 中实现一个名为 lock 的 MySQL 样式:

使用sqlalchemy Session,我直接执行了一个GET_LOCK:

lock = session.execute("SELECT GET_LOCK('TEST', 5)")

然后,如果我的锁没问题,我就做我想做的事,尤其是我的数据库使用会话的一些东西。之后我释放锁:

session.execute("SELECT RELEASE_LOCK('TEST)")

我的问题如下: 如何确定发布时与数据库的会话连接与开始时的连接相同?

sqlalchemy 的文档说:

当事务状态在回滚或提交后完成时, Session 释放所有 Transaction 和 Connection 资源 [...]

http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html

我在 Web 应用程序的上下文中,所以每次提交会话时,或者如果会话回滚,下一个查询不能保证在同一个连接上。对于我的大部分操作来说,这不是问题,但对于 MySQL 命名锁,必须在同一个连接上请求“GET_LOCK”和“RELEASE_LOCK”。

我发现的唯一方法是为锁定设置一个特定会话:它只会为锁定保持连接。但是有没有办法不为此目的使用连接?

编辑 2017-06-22

这个话题是关于同一主题的:SQLAlchemy session and connection relationship。但是如果使用 scoped_session:

  • 关于上述文档的摘录,在提交或回滚之后,未来查询与此会话的连接可能会有所不同,对吧?
  • 线程中将使用唯一会话?

【问题讨论】:

    标签: python-2.7 sqlalchemy


    【解决方案1】:

    如果这可以帮助其他人,最后我在请求中第一次获取会话时使用了带绑定的 scoped_session:

    # Initialization:
    Session = scoped_session(sessionmaker(bind=engine))
    
    # ...
    
    # Before processing a request:
    connection = engine.connect()
    Session(bind=connection)
    
    # ...
    
    # After the processing
    Session.remove()
    connection.close()
    

    使用此配置,如果在我的请求处理期间我使用 GET_LOCK/RELEASE_LOCK,它们将应用于同一连接。

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 2016-12-25
      • 2016-02-24
      • 2018-06-26
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多