在 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;')
以上两种方法都没有提高更新速度。上面的代码有什么问题吗?
最佳答案
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
关于mysql - 在 Django 程序中的数百个 MySQL UPDATE 语句期间禁用自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3656397/