gpt4 book ai didi

python - 当从另一个进程保存对象时,在 Model.objects.filter() 之后需要 Django transaction.commit()

转载 作者:行者123 更新时间:2023-11-28 21:58:24 25 4
gpt4 key购买 nike

我有两个进程运行 Django 代码库,由于各种原因,一个进程将更新一个对象如下:

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

稍后另一个进程尝试读取该对象,如下所示:

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

从第二个进程读取值时,我看不到更新后的值,而是看到旧值。第二次运行该函数时,我确实看到了变化。

我注意到,如果从第二个过程(一次阅读)开始,我按如下方式更改函数,我会得到更新后的值:

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

filter() 调用下方添加装饰器 @transaction.commit_manuallytransaction.commit() 行后,我做从字段中获取更新后的值(从其他进程保存的。)

有什么理由需要这样做吗?在实际上根本不更新模型的函数上使用 transaction.commit() 的影响/潜在问题是什么?我不确定它为什么有效,如果它有意义,所以希望其他人遇到过这个问题。

谢谢,

最佳答案

由于您使用的是交易中间件,因此每个请求都会获得不同的交易。

The recommended way to handle transactions in Web requests is to tie them to the request and response phases via Django’s TransactionMiddleware.

It works like this: When a request starts, Django starts a transaction. If the response is produced without problems, Django commits any pending transactions. If the view function produces an exception, Django rolls back any pending transactions.

这意味着如果第二个进程的请求在写入被触发之前到达,它的事务将早于写入。然后数据库将做正确的事情并报告创建第二个进程的事务时的当前值。在读取之前手动提交第二个进程的事务是无害的(只要它没有进行任何编辑)并告诉数据库创建一个新事务。这将在 postdate 写入,因此会为您提供修改后的结果。

关于python - 当从另一个进程保存对象时,在 Model.objects.filter() 之后需要 Django transaction.commit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com