用于保证分布式数据库事务原子性的两阶段提交[Two-phase commit]
帮大家翻译一下,非专业人员,错误之处请大家谅解:
简介:
二阶段提交协议是事务处理、数据库和计算机网络中的一种原子性提交协议。 它是一种分布式算法,用于协调所有参与同一个分布式原子性事物的进程(提交或忽略事务)。此协议进程,网络节点,通信等失效的情况下仍然能保证事物原子性,所以它被广泛地使用。然而,它无法容忍所有可能的失败的配置,并且偶尔为获得正确结果而需要人为介入。为容纳从失败中恢复,此协议的参与者用日志记录协议状态。这种经常缓慢但挽救错误的日志记录被用于协议的恢复性存储过程。许多不同的协议的主要不同点在于日志记录策略和恢复机制。尽管恢复性存储过程经常有意被频繁的使用,但是它是二阶段提交协议的本质部分!许多可能的失败场景在这协议中都被考虑了进去。
协议使用的环境:
一个节点作为协调者[主站],其余的网络节点作为队列[cohorts]
协议的几点假设:
前两点必须严格遵守,否则数据可能丢失,最后一点不必严则遵守,因为网络会被重新路由:
1.每个节点都是有预写式日志[write-ahead log]的稳定存储设备
2.永远没有节点崩溃
3.预写式日志中的数据绝不会丢失或因为崩溃而损坏
4.任意两节点都能互相通信
缺点:
如果协调者[主站]永久性失效的话,一些队列[cohorts]就不能解决其事务。
基本算法:
提交请求阶段[投票阶段]:
1.协调者给所有cohorts发送一个Commit请求,然后等待所有cohorts的回复
2.当cohorts收到Commit请求时,执行事务。每一个cohort在undo log和redo log中各写入一条信息
3.如果事务执行成功,则cohort返回一条同意[agreement]的信息,反之,则返回忽略[abort]信息
提交阶段[完成阶段]:
投票成功:如果所有的cohorts都返回同意的信息
1.协调者发送一个Commit请求给所有的cohort.
2.每个cohort完成操作,释放事务的资源和锁
3.每个cohort发送确认[acknowledgment]信息给协调者
4.当协调者收到所有cohort的确认信息后,完成事务
投票失败:如果任何cohort返回不同意信息
1.协调者发送一个Rollback请求给所有的cohort.
2.每个cohort通过undo log取消事物,释放事物的资源和锁
3.每个cohort发送确认[acknowledgment]信息给协调者
4.当协调者收到所有cohort的确认信息后,取消事务
参考文献: