0

私はsqliteエンジン(開発サーバー)でsqlalchemyを使用していますが、クエリを更新した後、次のWebリクエストのクエリが古いデータセットを返すことを発見しました(プールがあることを理解しているので、リクエストにどのスレッドが使用されているかによって異なります)のスレッド)。

私が使用scoped_sessionしているのは、ドキュメント ( DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))) のその他の推奨事項です。

Web リクエストの例とそこで実行される内容を次に示します。

request-1:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1)
request-2:thread-2: UPDATE table SET data=2 WHERE id=1; COMMIT
request-3:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1) // STILL data:1 !
request-4:thread-4: SELECT * FROM table WHERE id=1 -> (id:1, data:2) // NEW DATA!     
request-5:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1) // AND AGAIN OLD DATA!

これは何ですか?どうすればこの動作を回避できますか? 上記の例では、すべての Web リクエストが連続して実行されるため、SQL クエリは交差しません。

4

2 に答える 2

0

pyramid_tmトゥイーンを有効にする必要があります。

[app:main]

pyramid.includes =
    pyramid_tm

トゥイーンは各リクエストの後にトランザクションをコミットし、新しいリクエストが来ると暗黙的に新しいトランザクションを開始します。

新しいトランザクションを開始しないと、古いトランザクションは他のトランザクション (スレッド) でコミットされたデータを認識しません。これは、データベース トランザクション固有の機能です。そうしないと、不整合エラーが発生する可能性があります。

于 2013-09-08T23:44:46.540 に答える