在Django程序中的数百个MySQL UPDATE语句中禁用自动提交

时间:2010-09-07 06:58:54

标签: mysql django transactions indexing autocommit

在Django程序中,如何在数百个UPDATE之前显式禁用自动事务管理,并在UPDATE完成后启用它?

我调查了http://docs.djangoproject.com/en/dev/topics/db/transactions/,但没有发现任何线索。

我尝试将以下代码放在开头

settings.DISABLE_TRANSACTION_MANAGEMENT = True

我也试过

cursor = connection.cursor()
cursor.execute('SET SESSION autocommit = 0;')
...
UPDATE
...
cursor.execute('SET SESSION autocommit = 1;')

上述两种方法都没有提高更新速度。上述代码有什么问题吗?

2 个答案:

答案 0 :(得分:3)

from django.db import transaction

@transaction.commit_on_success
def my_function_that_does_thousands_of_updates():

    # Do whatever you want here
    transaction.set_dirty()

这将允许您运行要运行的任何SQL,然后只有在没有异常时才提交。如果您在示例中使用手动游标,则需要set_dirty()调用,但如果您只使用Django ORM则不需要(如果我没有弄错;至少这是1.2行为)。< / p>

要完全控制交易,您可以使用transaction.commit_manually装饰器。至于你的速度问题,我无法发表评论。

django文档很好地解释了这一点:http://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_on_success

答案 1 :(得分:0)

如果您只进行数百次更新而不是数万次更新,速度问题可能不是由于写入数据,而是由于找到了相应的数据。也许在update语句中有一个where子句,需要一段时间才能找到要更新的正确行。如果是这种情况,那么关闭自动提交将无济于事 - 你需要在where子句中的字段索引。

表格中有多少行? 更新语句是什么样的?

你也可以尝试准备好的陈述,但是对于千分之一的更新,它应该没有太大的区别。