2

これが私のシナリオです:最初のビューはフォームをレンダリングし、データは2番目のビューに移動し、そこでDB(MySQL)に保存し、dbに書き込まれた内容を示す3番目のビューにリダイレクトします:

Stoing to db:
    DBSession.add(object)
    transaction.commit()

DB Session:
    DBSession = scoped_session(sessionmaker(expire_on_commit=False,
                                            autocommit=False, 
                                            extension=ZopeTransactionExtension()))

その後、ページを数回更新すると、DB の変更が表示されることがありますが、そうでない場合もあります。1 回目は古いデータ、2 回目は新しいデータなどです...サーバーを再起動すると (ローカルで保存)、DB データは最新です.

多分それはセッションを作成することの問題ですか?

4

4 に答える 4

1

MySQL のトランザクション分離レベルを確認してください。

InnoDB のデフォルトは次のREPEATABLE READとおりです。「同じトランザクション内のすべての一貫した読み取りは、最初の読み取りによって確立されたスナップショットを読み取ります。」

への呼び出しで分離レベルを指定できますcreate_engineSQLAlchemy のドキュメントを参照してください。

READ COMMITTED分離レベルを試して、問題が解決するかどうかを確認することをお勧めします。

于 2012-10-11T10:44:06.637 に答える
0

トランザクション オブジェクトが何であるか、または SQLAlchemy データベース セッションにどのように接続するかは明確ではありません。Pyramid docs でトランザクションについて何も見ることができませんでしたし、トランザクション オブジェクトを SQLAlchemy セッションにリンクするコードも何も見当たりません。このコードはどのような例に基づいていますか?

また、sessionmaker呼び出しは通常、単一のセッション ファクトリを作成するためにファイル スコアで行われ、その後、同じソースからセッション オブジェクトを作成するために繰り返し使用されます。「sessionmaker() 関数は通常、トップレベルのセッション構成を作成するために使用され、構成引数を繰り返す必要なくアプリケーション全体で使用できます。」

複数のセッション ファクトリを作成しているため、セッション間で共有されるはずのデータが、ファクトリごとに 1 回作成されるため実際には共有されない場合があります。sessionmaker を 1 回だけ呼び出してみて、違いが生じるかどうかを確認してください。

于 2012-10-15T11:34:36.653 に答える
0

あなたの問題は持続的なセッションである可能性が高いと思います. デフォルトでは、Pyramids はコミット後にセッション内のすべてのオブジェクトを期限切れにします。これは、SQLA が次に必要なときにデータベースからオブジェクトを取得し、それらが新鮮であることを意味します。

「expire_on_commit=False」を示すことで、このデフォルトをオーバーライドしました。そのため、変更をコミットした後、そのセッション オブジェクトが後続のリクエストで新しいデータを取得することを意図している場合は、必ず session.expire_all() を呼び出してください。(セッション オブジェクトは Pyramid の複数のリクエストで同じですが、同じスレッド スコープのセッションを取得できる保証はありません) コミット時に有効期限を false に設定しないこと、または非グローバル セッションを使用することをお勧めします: http:/を参照してください。 /docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#using-a-non-global-session

または、必要に応じてオブジェクトを期限切れにすることもできます。有効期限が切れていないオブジェクトはそのままメモリに残り、更新されず、別のスレッドスコープのセッションの同じオブジェクトとは異なる可能性があることを知っておいてください。

于 2013-04-03T08:20:20.320 に答える