两阶段提交 2PC 2 phase commit
复习:
sql 拆成一个个算子 projection join(通信计划 协调完成)结果分布在分布数据库的节点上
事务:一个事务分成若干项工作 扔给每个节点 每个节点有日志保证机制
acid无法通过局部的机制保证 需要全局的机制
I distributed locking 全局锁
A D 单个节点(redo/undo)job1已完成 必须强迫job2完成 而job2无法完成,job2 未完成(abort/rollback
2PC
需要全局机制(2PC two phase commit 每个job先将其job做完 但不提交 每个节点可以清楚它的job可否提交
phase1:TM询问每个节点能否提交 节点返回确认 如果发现所有人都可以提交
phase2:TM下达指令提交
如果任何节点告诉TM不能提交,在phase2TM告诉大家要abort
有的节点突发故障 其所在计算机宕机
通信不应答(job节点/TM)陷入僵局
如果一个数据库有一块数据所有人都无法访问 数据库出故障
TM收到所有job返回都是准备好了,说明这个事务可以提交 出故障节点回来后会跟随提交事务
TM没有收到足够的准备好了的反馈,将事务abort
2phase commit 遇到问题:两个节点都故障 其中一个是TM 无法结束事务
不知道TM是否收到所有准备好了的反馈 也不知道它有没有发送给某些节点让它提交/abort的指令
改变协议 3PC
询问两遍 规避所有blocking