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

jac*_*ack 5 mysql django indexing transactions autocommit

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

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

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

settings.DISABLE_TRANSACTION_MANAGEMENT = True
Run Code Online (Sandbox Code Playgroud)

我也试过

cursor = connection.cursor()
cursor.execute('SET SESSION autocommit = 0;')
...
UPDATE
...
cursor.execute('SET SESSION autocommit = 1;')
Run Code Online (Sandbox Code Playgroud)

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

小智 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()
Run Code Online (Sandbox Code Playgroud)

这将允许您运行任何您想要运行的 SQL,然后仅在没有异常的情况下提交。如果您像示例中那样使用手动光标,则需要 set_dirty() 调用,但如果您只使用 Django ORM,则不需要调用 set_dirty() (如果我没记错的话;这至少是 1.2 行为)。

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

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