3

Django コードベースを実行している 2 つのプロセスがあります。さまざまな理由から、1 つのプロセスが次のようにオブジェクトを更新します。

myObj.aField = "updated"
myObj.save()

その後、他のプロセスは次のようにそのオブジェクトを読み取ろうとします。

def getObj(xxx):
   objs = TheModel.objects.filter(xyz=xxx)
   for obj in objs:
      print obj.aField

2 番目のプロセスから値を読み取ると、更新された値は表示されず、代わりに古い値が表示されます。関数を 2 回目に実行すると、変化が見られます。

2 番目のプロセス (1 つの読み取り) から関数を次のように変更すると、更新された値が取得されることに気付きました。

@transaction.commit_manually
def getObj(xxx):
    objs = TheModel.objects.filter(xyz=xxx)
    transaction.commit()
    for obj in objs:
        print obj.aField

呼び出しのすぐ下にデコレータ@transaction.commit_manuallyと行を追加した後、フィールドから更新された値を取得します (これは他のプロセスから保存されました)。transaction.commit()filter()

これが必要な理由はありますか?transaction.commit()実際にモデルをまったく更新しない関数を使用することの影響/潜在的な問題は何ですか? なぜそれが機能するのかはわかりませんが、それが理にかなっている場合は、他の誰かがこの問題に遭遇したことを願っています.

ありがとう、

4

2 に答える 2

1

私もこの問題に遭遇しました。Django はクエリ結果をキャッシュします (これは単一プロセスにとっては良いことです)。2 番目のプロセスに同じクエリのキャッシュがある場合、キャッシュがフラッシュされるまで更新は表示されません。

何らかの理由でtransaction.commit()キャッシュをフラッシュするため、この問題に役立ちます。クエリを実行する直前にそのメソッドを呼び出すと、データベースから直接結果が表示されるはずです。

于 2013-08-20T20:17:26.947 に答える