0

HTMLページで質問に答えることができるMySQLデータベースを備えたDjangoアプリがあります。回答は、AJAX 呼び出しを介してサーバーに送信されます。これらの呼び出しは、さまざまな JavaScript イベントによって開始され、多くの場合、1 つの応答に対して複数回発生する可能性があります。これが発生すると、1 つの回答に対する複数の保存要求がサーバーに送信されます。

回答の重複を避けるために、各回答には、最初に保存されたときに生成されるクライアント側 ID があります - client_id. サーバー側で新しい回答を作成する前に、Django アプリはまず DB をチェックして、そのような回答がclient_id存在するかどうかを確認します。その場合、2 番目の保存リクエストは、新しい回答を作成する代わりに回答を更新します。

Chrome では、テキスト入力フィールドがフォーカスされているときに、ユーザーが Chrome ウィンドウの外側をクリックすると、2 つの保存リクエストが次々に発生します。サーバーは両方を受信します。client_id例として、が 71であるとしましょう。

最初のリクエストは DB をチェックし、client_id71 の回答が存在しないことを確認します。新しい回答を作成し、DB に保存します。ブレークポイントを使用してデバッグしていますが、現時点では、外部の MySQL データベース ビューアーで実際に回答が保存されていることがわかります。私のIDEでは、実行するAnswer.objects.filter(client_id=71)と答えも得られます。デバッガーを続行させます。

すぐに、2 番目の AJAX 保存応答要求に対して 2 番目のブレークポイントが発生します。今、奇妙なことが起こります。IDE で実行するAnswer.objects.filter(client_id=71)と、答えが表示されません。私の外部ツールは、答えがそこにあることを確認します。したがって、私のコードは新しい回答を作成して保存します。IDEで実行するAnswer.objects.filter(client_id=71)と、2つの答えが表示されclient_idます。

DB接続またはMySQLは、ビューを一定に保つために何らかの時間ベースの方法を使用していると推測していますが、ここで問題が発生しています。DB の状態をリアルタイムで把握したいと考えています。

私はトランザクション管理を使用していないので、Django は auto_commit を実行する必要があります。

実際にDBにあるデータを考慮して、DB接続自体に「リフレッシュ」または「リセット」するように指示するにはどうすればよいですか?

4

1 に答える 1

0

@transaction.autocommitビューをデコレータでラップtransaction.commit()し、特定の回答が存在する場合はデータベースをチェックインする直前に実行することで、この問題を解決しましたclient_id。これで、目指していた「リフレッシュ」が実現。

于 2013-06-16T10:54:52.030 に答える