SQLAlchemy:回滚

时间:2017-05-22 13:16:20

标签: python-2.7 sqlalchemy

我想在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的文档说:

  

在回滚或提交后完成事务状态时,   会话释放所有交易和连接资源[...]

     

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:

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

1 个答案:

答案 0 :(得分:0)

如果这可以帮助其他人,最后我在请求中第一次获得会话时使用带有绑定的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,它们将应用于同一连接。