2017-11-29 14 views
1

IましたフラスコSQLAlchemyの中のアプリと私がスケールするhoriontallyフラスコSQLAlchemyの水平スケーリングとスコープのセッション

@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 

2つのエンドポイントがあります:

読み取り - ID = 1となったエンティティ値

増加を取得し、私は水平にスケールする

そして、ID = 1と増加する値を持つ=取得したエンティティ、およびフラスコSQLAlchemyのは同期しないSE労働者間の争い。

ご覧のとおり
curl GET /read/ [worker-1] 
1 


curl GET /increase/ [worker-2] 
2 


curl GET /read/ [worker-1] 
1 

は、SQLAlchemyのは自動的にセッション状態をリフレッシュするためのツールを提供していません:だからでも、私は労働者2の値を増加させ、労働者から1

例のユーザー要求を実際の値を取得する方法はありません。

これを修正するにはどうすればよいですか?新しいクエリに新しいセッションを使用していますか?またはsession.refresh(instance)を使用してください。これを行うにはどのような方法がありますか?

答えて

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() 

その後も、同じオブジェクトへの同時編集は安全ではありません。選択更新をアトミックにする場合は、セッションの分離レベルを変更する必要があります(this answer参照)。

+0

Flask-SQLAlchemyはすでにこれを行います。 – leovp

+0

もう一つのオプションは、flask-sqlalchemy yesを使用することです。それは私がリンクしているそのページのFlaskでも勧められます。それは最も確実に問題を解決するでしょう。 – remram

+0

私は、質問している人が既にFlask-SQLAlchemyを使用しています。 – leovp

関連する問題