提交多个事务时出现MVCC_READ_CONFLICT错误

9

我有一个概念性的问题。我正在异步请求Composer REST,但是我收到了一条消息:'error trying invoke chaincode. Error: Peer has rejected transaction \'552b42fa4d2cfd366ff1b7d01371878f53f7553b44f141187c6db86b75f68906\' with cdoe MVCC_READ_CONFLICT',。当我使用node-sdk时也遇到了同样的问题。这是什么原因呢?难道不能异步提交多个交易吗?

2个回答

11

1
避免键冲突是什么意思?我在循环中生成自定义资产键(递增),但当尝试提交它们时仍然出现错误... - Nathan H
1
如果您有多个线程同时更新给定的键,则会遇到MVCC读取冲突问题,因为没有全局锁来防止对键的并发更新。在提交时,检查键的版本号--如果与先前读取的版本号不同,则事务将被回滚(因为先前的读取现在是脏的)。 - Dan Selman
你如何建议测试此错误代码?返回的错误对象没有error.code的值(显示未定义)。 error.message和error.stack正确填充。检查composer-connector-hlfv1/lib/hlfconnection.js中的错误处理函数,显示composer提供的所有错误消息都没有任何错误代码。 - Bob Dill
1
嗨,丹,你能解释一下BatchTimeout设置如何用于降低延迟吗?为了最小化冲突,你会将其从默认值2秒增加还是减少? - Psymatix
2
今天我在尝试通过Composer REST API进行多个参与者的交易时遇到了这个错误。有没有什么方法可以避免这种情况?或者我们只能使所有调用同步进行... - TheOkayCoder
我在使用node-sdk时也遇到了同样的问题。 - Fthi.a.Abadi

7
当您提交交易时,节点会生成读写集。在交易提交到分类帐时使用该读写集。它包含要读取/写入的变量名称及其读取时的版本。如果在创建读写集和提交之间的时间内,有不同的交易被提交并更改了变量的版本,则原始交易将在提交时被拒绝,因为读取时的版本不是当前版本。
为解决这个问题,您需要创建数据和交易结构,以避免同时编辑相同的键。fabric-samples提供了一种示例方法来做到这一点。

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


2
我已经尝试了上面链接中的链码,但没有成功。我仍然收到MVCC_READ_CONFLICT错误。有什么想法是什么原因呢?我的交易速率只有3 Tx/s。使用了2个背书节点。 - Byebye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接