Hyperledger fabric Hyperledger结构-并发事务

Hyperledger fabric Hyperledger结构-并发事务,hyperledger-fabric,hyperledger-composer,Hyperledger Fabric,Hyperledger Composer,我想知道如何使用hyperledger composer在hyperledger结构中执行并发事务。 当我试图针对同一资源同时提交两个事务时,会出现以下错误: 尝试调用业务网络时出错。错误:对等方拒绝了带有代码MVCC\U READ\U冲突的事务“事务编号” 有人知道是否存在一种解决方法或设计模式来避免这种情况吗?虽然我可能没有提供最佳的解决方案,但我希望与大家分享一些想法和可能的解决方法 首先,让我们简要解释一下为什么会出现此错误。Hyperledger结构的底层数据库采用类似MVCC(多版本

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

尝试调用业务网络时出错。错误:对等方拒绝了带有代码MVCC\U READ\U冲突的事务“事务编号”


有人知道是否存在一种解决方法或设计模式来避免这种情况吗?

虽然我可能没有提供最佳的解决方案,但我希望与大家分享一些想法和可能的解决方法

首先,让我们简要解释一下为什么会出现此错误。Hyperledger结构的底层数据库采用类似MVCC(多版本并发控制)的模型。例如,两个客户端试图将版本为0的资产更新为特定值。一个会成功(更新了值并将stateDB中的版本号增加到1),而另一个会由于版本不匹配而失败,并出现此错误(MVCC_READ_CONFLICT)

这里讨论的一个可能的解决方案()是在业务逻辑和Fabric SDK之间自行实现FIFO队列。在这种情况下,还可以添加重试逻辑

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


有关更多信息,您可以查看以下内容:

我最近遇到了这个问题,并通过创建一系列异步函数调用承诺来解决它,然后一次解决一个

我的事务将Asset2Id和Asset3Id数组中的项目添加到asset1上的数组字段中。我的所有事务都作用于同一资产,因此在提交每个事务之前,由于读/写集发生了更改,我收到了一个MVCC_读取_冲突错误。通过强制以同步方式解决事务,此冲突得到修复:

// 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());

链接的第一篇文章似乎有点误导性——Hyperledger Fabric在区块链逻辑中有自己的MVCC,但据我所见,它与CouchDB的MVCC无关。介绍了它的工作原理——它没有提到CouchDB,因为这是另一个层次。包括Hyperledger结构MVCC的工作原理以及性能影响的说明。