Djang中MySQLdb的MySQL响应中的缓存问题

2024-05-15 19:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python和Django中使用MySQL和MySQLdb模块。在

在本例中,我运行的是自动提交模式(以及Django的)事务管理()实际返回False)。在

我有几个进程与数据库交互。在

一个进程获取所有任务模型任务.objects.all()

然后另一个进程添加一个任务模型(我可以在数据库管理应用程序中看到它)。在

如果我打电话任务.objects.all()在第一个过程中,我什么也没看到。但如果我调用connection.\u commit(),然后任务.objects.all(),我看到了新任务。在

我的问题是:在连接级别是否涉及缓存?这是正常的行为吗(我不这么认为)?在


Tags: 模块django数据库falseobjects进程过程mysql
1条回答
网友
1楼 · 发布于 2024-05-15 19:25:26

这显然与自动提交/表锁定有关。在

如果mysqldb实现了dbapi2规范,那么它可能会有一个连接作为单个连续事务运行。当你说:'running in autocommit mode':你是指MySQL本身还是mysqldb模块?还是Django?在

没有断断续续的承诺完美地解释了你的行为:

i)在mysqldb中实现为单个事务的连接(可能在默认情况下)

ii)仅在需要时才打开/关闭连接,而是(重新)使用一个(或多个)持久数据库连接(我猜,可能是Django架构继承的)。在

ii)您的select('reads')会导致一个表上的“简单读锁”(simple read lock)(这意味着其他连接仍可以“读取”此表,但想要“写入数据”的连接不能(立即)获得此表上的“独占锁”(需要“写入”)。因此,写入被无限期地推迟(直到它可以在表上获得一个(短的)独占锁来进行写入-当您关闭连接或手动提交时)。在

我会为你做以下的事情:

  • 在上面的场景中,找出数据库上有哪些表锁
  • read about Django and transactions here。快速浏览一下建议使用标准的Django功能隐式地导致提交。这意味着发送手工编制的SQL可能不会(插入、更新…)。在

相关问题 更多 >