2011-06-30 17 views

回答

5

即使在極少數情況下兩個請求在同一時間處理完畢,如果出現衝突,ZODB將引發ConflictError並重試您的請求,您將完全安全。

應對下面的討論:

一臺計算機上然後通過defition交易雙方必須重疊(你從了time.time()的每個線程相同的結果。)ZODB是MVCC,所以每個線程看到與交易開始時一致的數據庫視圖。當第二個線程提交時,將會引發衝突錯誤,因爲它會寫入自事務開始以來發生更改的對象。

如果您的客戶端運行在多臺計算機上,那麼您需要考慮客戶端之間時鐘漂移的可能性。對於其交易ID,ZODB選擇當前時間戳或最後一個交易ID + 1中的較大者。

但是,也許您應該考慮不使用時間戳作爲ID,因爲它會導致衝突因爲所有請求都需要在同一個BTree桶中創建條目。隨機挑選ID將消除幾乎所有的衝突,但會導致效率低下的BTrees。推薦的方法是創建對象的每個線程在數字空間的隨機點開始,並順序創建ID。如果它發現已經使用了一個ID,那麼它應該隨機選取數字空間中的另一個點並從那裏重新開始。我相信zope.intid包含了這個策略的實現。

+0

我正在想衝突錯誤:如果它被提出,它如何重試請求?請求是否丟失? –

+0

不,Plone(Zope實際上)重試它,因爲有衝突錯誤,所以請求不會丟失,因爲Zope是處理請求的人。 – vangheem

+1

我懷疑你會遇到衝突錯誤的情況。相反,一個請求會收到有關正在使用的ID的例外情況。 –

相關問題