【问题标题】:caching issues in MySQL response with MySQLdb in Django在 Django 中使用 MySQLdb 在 MySQL 响应中缓存问题
【发布时间】:2010-10-31 10:25:09
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python mysql django connection commit


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢。对于自动提交模式,我的意思是从 Django 的角度来看:我专门将 Django 配置为自动提交。这可能是 Django 中的一个错误,但我很确定这不是因为它会产生其他影响。我试试直接用mysqldb看看是怎么回事。
    • 对于 i) 我必须测试或查找文档。对于 ii) 我正在使用不同的进程(使用管理命令),因此连接池似乎是不可能的。对于iii)在我的情况下完成了写入(写入数据的过程退出并且我可以看到数据),所以它看起来不像与锁定相关的问题。
    • 我解决了这个问题。我对 Django 事务管理的理解有点错误(但文档不清楚):事务管理不会影响数据库中自动提交或事务模式的情况。它只是在事务中运行请求/响应周期的包装器。 Django 的自动提交不是数据库中的实际自动提交。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2015-06-19
    • 2014-04-11
    • 2013-08-29
    相关资源
    最近更新 更多