多个进程访问 Django db 后端;直到手动调用 _commit 后才会显示记录

2024-01-28

我有一个 Django 项目,其中多个进程正在访问后端 mysql 数据库。一个进程正在创建记录,而第二个进程正在尝试读取这些记录。我遇到一个问题,在我手动调用 connection._commit() 之前,尝试读取记录的第二个进程实际上无法找到记录。

这个问题之前已经被问过:Django 中 MySQLdb 的 MySQL 响应中的缓存问题 https://stackoverflow.com/questions/952216/caching-issues-in-mysql-response-with-mysqldb-in-django

OP 表示他解决了这个问题,但没有完全解释如何解决。有人能解释一下吗?我希望能够访问记录而无需手动调用 _commit()。

Thanks,

Asif


He said:

Django 的自动提交并不是数据库中实际的自动提交。

因此,您必须确保在数据库级别设置自动提交。否则,由于事务隔离,进程将看不到不同进程(不同连接)所做的更改,直到完成提交。 AFAIK 这并不是一个 Django 问题,除了关于 Django autocommit != db autocommit 的文档缺乏清晰度之外。

Update:稍微解释一下 MySQL 文档:

可重复读取是默认值 InnoDB 的隔离级别。为了 一致的读取,有一个 与 READ 的重要区别 已提交隔离级别:全部 同一内容内的一致读取 事务读取快照 由第一次读取建立。 (我的 强调。)

因此,使用可重复读取,您只能在后续读取中获得第一次读取中读取的内容。通过 READ COMMITTED,每次读取都会创建并读取自己的新快照,以便您看到其他事务的后续更新。因此,为了回答您的评论,您对交易级别的更改是正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个进程访问 Django db 后端;直到手动调用 _commit 后才会显示记录 的相关文章

随机推荐