我有一个Django项目,其中多个进程正在访问后端mysql数据库。一个过程是创建记录,而另一个过程是尝试读取这些记录。我遇到的问题是,在手动调用connection._commit()之前,尝试读取记录的第二个进程实际上找不到记录。
之前已经问过这个问题: caching issues in MySQL response with MySQLdb in Django
OP说他解决了这个问题,但没有解释如何。任何人都可以对此有所了解吗?我希望能够在不手动调用_commit()的情况下访问记录。谢谢,
阿西
答案 0 :(得分:5)
Django的自动提交不是数据库中的实际自动提交。
因此,您必须确保在数据库级别设置自动提交。否则,由于事务隔离,在完成提交之前,进程不会看到由不同进程(不同连接)所做的更改。 AFAIK这不是特别的Django问题,除了关于Django autocommit的文档缺乏清晰度!= db autocommit。
更新:稍微从MySQL文档中解释:
REPEATABLE READ是默认值 InnoDB的隔离级别。对于 一致的读,有一个 与READ的重要区别 委托隔离级别:全部 一致的读取内容 事务读取快照 由第一次阅读建立。 (我 的强调。)
因此,使用REPEATABLE READ,您只能在后续读取时获得第一次读取时读取的内容。使用READ COMMITTED,每次读取都会创建并读取自己的新快照,以便您可以看到其他事务的后续更新。所以 - 在回答您的评论时 - 您对交易级别的更改是正确的。
答案 1 :(得分:0)
您是否将流程作为视图运行?如果是这样,它们可能在请求完成处理时提交,但听起来您正在同时运行这些进程。如果在视图外部运行该进程,则应在每次保存时提交。