我想在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:
答案 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,它们将应用于同一连接。