2010-09-07 69 views
2

在Django程序中,如何在数百个UPDATE之前显式禁用自动事务管理并在UPDATE完成后启用它?在Django程序中的数百个MySQL 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

你确实知道'InnoDB'表这只作品(因为他们支持相反的交易,以'MyISAM'表我认为)在'MySQL',但我想你已经阅读过文档。 – 2010-09-07 07:45:00

+0

@rebus,是的,这是一个InnoDB表。 – jack 2010-09-07 13:40:51

回答

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,则不需要set_dirty()调用(如果我没有弄错;至少是1.2行为)。

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

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

0

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

表中有多少行? 更新说明是什么样的?

您也可以尝试准备好的语句,但是对于千次更新,它应该没有太大区别。