在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;')
上述两种方法都没有提高更新速度。上述代码有什么问题吗?
答案 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子句中的字段索引。
表格中有多少行? 更新语句是什么样的?
你也可以尝试准备好的陈述,但是对于千分之一的更新,它应该没有太大的区别。