知识卡片
链码调用写入非强事务、读取立即可见
内容
invoke和query都是调用链码Invoke()方法,区别在于invoke的模拟执行结果只是暂存到交易模拟器中,还要经过[[Fabric共识拆成背书排序验证三阶段]]完整走一遍排序与验证才会真正提交账本,因此调用invoke之后立刻查询未必能读到最新写入的值——这是execute-order-validate架构下天然的最终一致性代价。query则完全绕开排序,直接在本地Endorser节点执行、直接返回结果,不产生交易也不需要写账本。这解释了为什么书中特别提醒”链码操作不具有强事务性”:不是bug,而是把”能否立刻读到自己刚写的值”这件事,主动让位给了”允许背书节点并行模拟执行以换取吞吐”的架构选择。
参考来源
《Hyperledger Fabric技术内幕:架构设计与实现原理》第3章《Peer节点》