知识卡片

区块内写后读必然失败的场景限制

专业/工作 · 535.b

内容

[[交易验证的可并行与必须串行两阶段]]中必须串行执行的MVCC检查有一条硬规则:如果一笔交易的读集合命中了同一个区块里排在它前面的交易所写的键,这笔交易会被直接判定为无效——即使那笔”前面的交易”本身完全合法。原因是账本状态数据库只在区块被整体提交之后才更新,区块验证阶段还没有任何交易的写结果真正落库,所以区块内任何”先写后读”的组合天然读不到最新值。这不是bug,而是[[Fabric共识拆成背书排序验证三阶段]]execute-order-validate架构下的结构性代价:背书阶段各交易并行模拟执行时互不知道彼此,自然无法保证读到同批次里其他交易的写入。这决定了Fabric更适合一次写多次读、或低频写同一个键的业务场景,高频对同一键连续读写的场景会产生大量因假性冲突被拒绝的交易。

参考来源

《Hyperledger Fabric技术内幕:架构设计与实现原理》第5章《Committer记账节点》