2010-09-07 11 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子句中的字段上使用索引。

表中有多少行? 更新說明是什麼樣的?

您也可以嘗試準備好的語句,但是對於千次更新,它應該沒有太大區別。