python - 在 Django 中使用 MySQLdb 的 MySQL 响应中的缓存问题

标签 python mysql django connection commit

我在 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/

相关文章:

mysql - 触发错误 ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG : Can't update table

php - MySQL 选择不返回资源

python - Django:从元组中获取首选值

python - Django 文件字段更新导致错误,即使不是必需的

python - 算法 : how to split list data into fixed size sub-lists without having separate numbers

php - MySQL II 中的分层查询

python - 如何使用逗号作为千位分隔符打印数字

python - 在 Windows 上安装 Django

python - 在 Mac 上的终端中运行 Python 3.6?

python - 将矩阵乘以Numpy中另一个矩阵的每一行