知识卡片
两阶段提交保证区块与隐私数据库的一致性
内容
提交一个区块时,Fabric要同时写两个独立的存储:区块数据文件和隐私数据库,两者写入不是一个原子操作,中途崩溃就可能导致一个写成功另一个没写,账本从此不一致。Fabric的解法是仿两阶段提交:先调用隐私数据存储的Prepare()把隐私数据写入更新批量操作但不真正确认提交;再执行区块数据的AddBlock();只有区块写入成功后才调用隐私数据存储的Commit()确认落库,区块写入失败则调用Rollback()撤销准备阶段的隐私数据变更。这样即使进程在两次写入之间崩溃,重启后也能通过检查区块号判断隐私数据是处于”已准备未确认”还是”已确认”状态,从而恢复到一致点,而不需要靠分布式事务协调器这类重量级机制。
参考来源
《Hyperledger Fabric技术内幕:架构设计与实现原理》第5章《Committer记账节点》