【问题标题】:Django database storage issueDjango数据库存储问题
【发布时间】:2022-01-06 21:25:58
【问题描述】:

所以我在线程(5)中运行一个特定的代码块,并且在线程执行的代码中,数据被保存到数据库中。例如

link = AccountLinkModel.objects.create(account=account)

如果我打印“链接”对象的值和 AccountLinkModel 模型中的任何字段,它们都打印成功,这意味着数据已创建,但最终在数据库中找不到一些记录,只有少数记录在数据库中。

关于可能导致此问题的任何建议?

【问题讨论】:

    标签: python mysql django multithreading


    【解决方案1】:

    也许尝试仅使用 1 个线程运行它以查看问题是否仍然存在,如果不是,您的代码中可能存在竞争条件,您没有正确锁定线程的共享资源。

    【讨论】:

    • 我刚刚测试过,它在一个线程上工作。锁定共享资源是什么意思。
    • 如果线程访问相同的对象,那么你需要使用锁来避免竞争条件,这里有一个教程:pythontutorial.net/advanced-python/python-threading-lock
    • 锁定写查询似乎不起作用
    【解决方案2】:

    如果我打印“链接”对象的值和 AccountLinkModel 模型中的任何字段,它们打印成功,这意味着数据已创建。

    如果create 函数被一个像这样的事务块包裹

    with transaction.atomic:
        link = AccountLinkModel.objects.create(account=account)
       ...other db stuff
    

    那么在调用创建函数后,该对象就不会在数据库中持久化。如果您在 create 调用之后打印,那么这只是 ram 中的 python 属性。

    【讨论】:

    • 代码块周围没有原子事务锁。
    • 有没有来自django orm之类的错误信息?
    • 没有错误,甚至显示记录已创建,可以打印ID
    • 好的 id 是 db 自己生成的还是像 uuid 这样从 orm 层动态生成的?
    • 也许你可以从你的代码库中添加或链接更多来调试它们。我用 django + celery 写了很多多线程代码。
    猜你喜欢
    • 2022-11-30
    • 2023-04-10
    • 1970-01-01
    • 2017-01-27
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多