我在flask-sqlalchemy中的应用程序,我想进行horiontally
@app.route('/read')
def read():
e = db.session.query(Example).get(1)
return e.value, 200
@app.route('/increase')
def increase():
e = db.session.query(Example).get(1)
e.value += 1
db.session.add(e)
db.session.commit()
return e.value, 200
有两个终点:
读取 - 获取id = 1且获得值的实体
增加=获取id = 1且值增加的实体
然后我想横向扩展,而flask-sqlalchemy不会在工作者之间同步会话。所以,即使我增加了工人2的价值,也无法从工人1获得实际价值
示例用户请求:
curl GET /read/ [worker-1]
1
curl GET /increase/ [worker-2]
2
curl GET /read/ [worker-1]
1
如您所见,sqlalchemy不提供自动刷新会话状态的工具。
解决此问题的最佳方法是什么?使用新会话进行新查询?或使用session.refresh(instance)
。建议的方法是什么?
答案 0 :(得分:1)
您应该在每次请求后拆除会话。 page on SQLAlchemy from the Flask website提供了以下代码段:
from yourapplication.database import db_session
@app.teardown_appcontext
def shutdown_session(exception=None):
db_session.remove()
即使这样,对同一对象的并发编辑也是不安全的。如果您希望select-update是原子的,则需要更改会话的隔离级别(请参阅this answer)。