2017-07-27 586 views
1

我有一個概念性問題。我正在對Composer REST執行異步請求,並且收到消息:'error trying invoke chaincode. Error: Peer has rejected transaction \'552b42fa4d2cfd366ff1b7d01371878f53f7553b44f141187c6db86b75f68906\' with cdoe MVCC_READ_CONFLICT',。使用node-sdk時遇到同樣的問題。這是什麼原因?不應該有可能異步提交多個事務嗎?MVCC_READ_CONFLICT同時提交多個交易

回答

3

Hyperledger Fabric使用無鎖樂觀併發性,在發生髒讀/寫情況時使用回滾。您需要儘可能避免重大沖突,並且可能需要在客戶端編寫重試邏輯。

的BatchTimeout設置織物可以用來在整個費用減少等待時間(儘量減少衝突的機會):

https://github.com/hyperledger/fabric/blob/release/sampleconfig/configtx.yaml#L144

+0

你說的避免鍵衝突的意思是:一個樣品的方式做,這是織物樣品在這裏提供的?我在一個循環(增量)中生成我自己的自定義資產密鑰,但當我嘗試提交它們時仍然出現此錯誤... –

+0

如果您有多個線程同時更新給定密鑰,那麼您將會遇到MVCC讀取衝突問題,因爲那裏沒有全局鎖定來防止同時更新密鑰。在提交時檢查密鑰的版本號 - 如果它與先前讀取的版本號不同,則事務回滾(因爲先前的讀取現在是髒的)。 –

+0

你如何建議測試這個錯誤代碼?返回的錯誤對象沒有error.code的值(未定義)。 error.message和error.stack被正確填充。檢查composer-connector-hlfv1/lib/hlfconnection.js中的錯誤處理函數表明,作曲者傳遞的錯誤消息中沒有任何錯誤代碼。 –

1

當您提交事務時,對產生的讀取和寫入組。當事務提交到分類帳時,將使用該讀/寫集。它包含要讀取/寫入的變量的名稱及其讀取的版本。如果在設置創建和提交之間的時間段內提交了不同的事務並更改了變量的版本,原始事務將在提交時被拒絕,因爲當讀取的版本不是當前版本時。

爲了解決這個問題,您將不得不創建數據和事務結構,以避免同時編輯相同的密鑰。

https://github.com/hyperledger/fabric-samples/tree/release/high-throughput