2012-11-01 32 views
3

我有一個視圖,需要執行更新數據庫涉及共享資源,需要鎖定(實施是複雜的,但只是一個共享計數器的核心)。Django事務和併發

從比賽條件保護我自己,我使用的代碼看起來大致是這樣的:

@transaction.commit_manually 
def do_it(request): 
    affected_models = Something.objects.select_for_update(blah = 1) 

    for model in affected_models: 
     model.modify() 
     model.save() 

    transaction.commit() 

是這種用法的commit_manuallyselect_for_update()save()好嗎?我該如何編寫一個測試來證實這一點?例如,我找不到Django在交易之間觸發的信號;我不能只是運行它,並希望併發問題出現並得到處理。

+1

關於測試邁克爾福德寫了關於類似的問題,它提供了[測試模式] [1]。它使用子進程。 [1]:http://www.voidspace.org.uk/python/weblog/arch_d7_2011_05_07.shtml – Ale

+0

http://www.caktusgroup.com/blog/2009/05/26/testing-django-views - 用於-併發問題/ – Ale

回答

0

爲什麼不在這裏使用commit_on_success

我想查詢本身應該是這樣的:

Something.objects.select_for_update().filter(...) 

我不認爲Django的確實在select_for_update什麼特別的東西,你可以斷言什麼。只有斷言來到我的頭上是assertTrue(queryset.query.select_for_update)。它什麼都不測試,並且只有在意外(?)移除呼叫時纔可能有用。

即使你爲這個運行條件問題提出了一些單元測試,我認爲將它放到項目中並不明智。

重點關注測試代碼,而不是數據庫行爲。