5

在 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;')

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

4

2 回答 2

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 行为)则不需要调用。

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

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

于 2011-02-24T04:03:00.737 回答
0

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

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

您也可以尝试准备好的语句,但对于不到一千次的更新,它应该不会有太大的不同。

于 2010-09-19T19:15:55.580 回答