Hyperledger fabric - 并发交易

Hyperledger fabric - Concurrent transactions

我想知道如何使用 hyperledger composer 在 hyperledger fabric 中执行并发事务。 当我尝试针对同一资源同时提交两个事务时,出现此错误:

Error trying invoke business network. Error: Peer has rejected transaction \'transaction-number\' with code MVCC_READ_CONFLICT

有谁知道是否存在避免这种情况的解决方法或设计模式?

虽然我可能没有提供最好的解决方案,但我希望分享一些想法和可能的解决方法来解决这个问题。

首先让我们简单解释一下为什么会出现这个错误。 Hyperledger Fabric 的底层 DB 采用类 MVCC(多版本并发控制)模型。这方面的一个例子是两个客户端试图将版本 0 的资产更新为某个值。一个会成功(更新值并将 stateDB 中的版本号增加到 1),而另一个会由于版本不匹配而失败并出现此错误 (MVCC_READ_CONFLICT)。

这里 (https://medium.com/wearetheledger/hyperledger-fabric-concurrency-really-eccd901e4040) 讨论的一个可能的解决方案是在业务逻辑和 Fabric SDK 之间自行实现一个 FIFO 队列。在这种情况下也可以添加重试逻辑。

另一种方法是使用增量概念。假设有一项资产 A 的值为 10(可能代表账户余额)。该资产被多个并发事务频繁更新(比如在这组值 12 -> 19 -> 16 中更新),很容易触发上述错误。相反,我们将值存储为增量(+2 -> +7 -> -3),最终聚合值在分类帐中将相同。但请记住,这个技巧可能并不适用于所有情况,在这个例子中,您可能还需要密切监控 运行 总数,以避免在您的帐户为空时捐钱。所以它在很大程度上取决于数据类型和用例。

更多信息可以看这个:https://github.com/hyperledger/fabric-samples/tree/release-1.1/high-throughput

我最近 运行 解决了这个问题,并通过创建一组调用异步函数的承诺解决了这个问题,然后一次解决一个问题。

My t运行sactions 将 asset2Idsasset3Ids 数组中的项目添加到 [=15= 上的数组字段]资产 1。我的 t运行saction 都作用于同一个资产,所以我得到了一个 MVCC_READ_CONFLICT 错误,因为 read/write 集在每个 t运行saction 被提交之前发生了变化。通过强制 t运行sactions 以同步方式解决,此冲突得到解决:

// Create a function array
let funcArray = [];
for (const i of asset2Ids) {
   // Add this transaction to array of promises to be resolved         
   funcArray.push(()=>transactionFunctionThatAddsAsset2IdToAsset1(i).toPromise());
}

for (const j of asset3Ids) {
  // Add this transaction to array of promises to be resolved
  funcArray.push(()=>transactionFunctionThatAddsAsset3IdToAsset1(j).toPromise());
}

// Resolve all transaction promises against asset in a synchronous way
funcArray.reduce((p,fn) => p.then(fn), Promise.resolve());