我在 Python 和 Django 中使用 MySQL 和 MySQLdb 模块。
在这种情况下,我在自动提交模式下运行(Django 的 transaction.is_managed() 实际上返回 False)。
我有几个进程与数据库交互。
一个进程使用 Task.objects.all() 获取所有任务模型
然后另一个进程添加了一个任务模型(我可以在数据库管理应用程序中看到它)。
如果我在第一个进程中调用 Task.objects.all(),我什么也看不到。但是,如果我调用 connection._commit(),然后调用 Task.objects.all(),我会看到新任务。
我的问题是:连接级别是否涉及缓存?这是正常行为吗(在我看来这不是)?
最佳答案
这显然与自动提交/表锁定相关。
如果 mysqldb 实现了 dbapi2 规范,它可能会有一个作为单个连续事务运行的连接。当你说:'running in autocommit mode'
:你是指 MySQL 本身还是 mysqldb 模块?还是 Django?
不间歇性地提交完美地解释了您的行为:
i) 在 mysqldb 中作为单个事务实现的连接(默认情况下,可能)
ii) 仅在需要时才打开/关闭连接,而是(重新)使用一个(或多个)持久数据库连接(我猜,可能是 Django 架构继承的)。
ii) 您的选择(“读取”)导致表上出现“简单读取锁定”(这意味着其他连接仍然可以“读取”该表,但想要“写入数据”的连接可以't(立即)因为这个锁阻止他们在这个表上获得“独占锁”(需要“写入”)。写入因此无限期推迟(直到它可以获得表上的(短)独占锁以进行写入- 当您关闭连接或手动提交时)。
对于您的情况,我会执行以下操作:
- 在上面的场景中找出你的数据库上有哪些表锁
- read about Django and transactions here .快速浏览一下建议使用标准 Django 功能隐含地导致提交。这意味着发送手工制作的 SQL 可能不会(插入、更新...)。
关于python - 在 Django 中使用 MySQLdb 的 MySQL 响应中的缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/952216/