我在Python和Django中使用MySQL和MySQLdb模块。在
在本例中,我运行的是自动提交模式(以及Django的)事务管理()实际返回False)。在
我有几个进程与数据库交互。在
一个进程获取所有任务模型任务.objects.all()
然后另一个进程添加一个任务模型(我可以在数据库管理应用程序中看到它)。在
如果我打电话任务.objects.all()在第一个过程中,我什么也没看到。但如果我调用connection.\u commit(),然后任务.objects.all(),我看到了新任务。在
我的问题是:在连接级别是否涉及缓存?这是正常的行为吗(我不这么认为)?在
这显然与自动提交/表锁定有关。在
如果mysqldb实现了dbapi2规范,那么它可能会有一个连接作为单个连续事务运行。当你说:
'running in autocommit mode'
:你是指MySQL本身还是mysqldb模块?还是Django?在没有断断续续的承诺完美地解释了你的行为:
i)在mysqldb中实现为单个事务的连接(可能在默认情况下)
ii)仅在需要时才打开/关闭连接,而是(重新)使用一个(或多个)持久数据库连接(我猜,可能是Django架构继承的)。在
ii)您的select('reads')会导致一个表上的“简单读锁”(simple read lock)(这意味着其他连接仍可以“读取”此表,但想要“写入数据”的连接不能(立即)获得此表上的“独占锁”(需要“写入”)。因此,写入被无限期地推迟(直到它可以在表上获得一个(短的)独占锁来进行写入-当您关闭连接或手动提交时)。在
我会为你做以下的事情:
相关问题 更多 >
编程相关推荐