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