2

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

在这种情况下,我在自动提交模式下运行(并且 Django 的 transaction.is_managed() 实际上返回 False)。

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

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

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

如果我在第一个进程上调用 Task.objects.all(),我什么也看不到。但是,如果我调用 connection._commit(),然后调用 Task.objects.all(),我会看到新任务。

我的问题是:连接级别是否涉及任何缓存?这是一种正常的行为吗(在我看来不是)?

4

1 回答 1

1

这似乎与自动提交/表锁定有关。

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

不间歇性地提交完美地解释了你得到的行为:

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

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

ii)您的选择(“读取”)导致表上的“简单读锁”(这意味着其他连接仍然可以“读取”该表,但想要“写入数据”的连接不能(立即)因为该锁阻止了它们从在此表上获得“排他锁”(需要“写入”)。因此,写入被无限期推迟(直到它可以在表上获得(短)排他锁以进行写入 - 当您关闭连接或手动提交时) .

在您的情况下,我会执行以下操作:

  • 在上面的场景中找出你的数据库上有哪些表锁
  • 在此处阅读有关 Django 和事务的信息。快速浏览一下建议使用标准 Django 功能隐含地导致提交。这意味着发送手工制作的 SQL 可能不会(插入、更新...)。
于 2009-06-04T18:54:12.273 回答