https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.admin.doc/ids_admin_1050.htm
两阶段提交协议
两阶段提交协议提供了一个自动恢复机制以防系统或者媒体在事务的时候失败。两阶段提交协议确保所有参与的数据库接受然后执行相同的行为,无视本地或者网络的失败
如果任何一个数据库服务器无法提交相关事务,则必须阻止参与事务的所有数据库服务器执行其工作。
数据库服务器在涉及到多台数据库服务的数据更改自动使用两阶段提交协议。举个例子,假如你有三个数据库服务器,叫australia,italy和france连接起来
如果你执行了如下的代码
CONNECT TO stores_demo@italy
BEGIN WORK
UPDATE stores_demo:manufact SET manu_code = 'SHM' WHERE manu_name = 'Shimara'
INSERT INTO stores_demo@france:manufact VALUES ('SHM', 'Shimara', '30')
INSERT INTO stores_demo@australia:manufact VALUES ('SHM', 'Shimara', '30')
COMMIT WORK
这种时候就要使用两阶段提交协议
每一个全局的事务都由一个协调者和多个参与者,定义如下:
协调者指导全局事务的结果。它决定提交这个事务或者拒绝这个事务
两阶段提交协议总是把协调的角色分配给当前的数据库服务器。在单个事务中,协调器的角色不能改变。在上面的例子中,协调者的角色是italy。如果把上面的代码第一行改变为
CONNECT TO stores_demo@france
每一个参与者指导一个事务分支的执行,这是与全局事务相关的一部分。当
应用程序使用多个进程来处理全局事务
多个远程应用程序用于同一个全局事务
全局事务包括数个事务分支。
在使用两阶段提交协议时,参与者是Italy和australia, 协调员数据库服务器italy也作为参与者,因为它也在进行更新。
两阶段提交协议依赖于两种通信,消息和逻辑记录
消息在协调员和每个参与者之间通过。来自协调器的消息包括事务标识号和指令(准备提交,提交或者回滚).来自每个参与者的消息包括事务的状态和所采取行为的报告(可以调教,不能提交或者回滚)。
事物的逻辑日志记录保存在磁盘或磁带上,即使数据库服务器发生故障,也可以保证数据的完整性和一致性。
在两阶段提交协议中,协调者把所有的数据修改指令发送给参与者,然后协调者启动两阶段提交协议。两阶段提交协议有两个部分,预提交阶段和后决定阶段。
预提交阶段,在预提交阶段,协调者先指导每一个参与数据服务器准备提交事务。参与者告诉协调者是否它们可以commit事务。协调者基于每一个参与者的回应,决定提交这个事务或者回滚这个事务。如果每一个参与者都返回可行,协调者就决定执行。如果有任何一个参与者没有准备好提交这个事务,协调者就决定终止这个事务。
后决定阶段,在后决定阶段,协调者把是提交还是回滚的记录存到日志中,然后把信息发送给参与者确认事务已经提交。如果协调者决定后滚,参与者回滚事务,但是不向协调者发送ack。然后协调者发送信息决定提交这个事务,它等待每一个参与者发送ack,然后终止这个事务。
两阶段提交协议被设计用来处理系统或者媒体的失败时保持所有参与者数据库数据的完整性。如果有失败产生,两阶段提交协议执行一个自动恢复。可以恢复以下的情况:
1.协调者系统失败
2.参与者系统失败
3.网络失败
4.管理者关闭协调者线程
5.管理者关闭参与者线程
管理者在自动恢复中的唯一工作是在系统或者网络失败的时候把协调者和参与者重新上线。
如果协调者线程失败,每一个数据库服务器的参与者必须决定是否在提交或回滚事务之后自动恢复。
在两阶段提交协议完成之前,有一个参与者线程预提交的部分工作终止了,就发生参与者恢复。参与者恢复的目标是根据协调者的指定完成提交。
回滚以以下方式处理。 当协调者确定事务必须回滚时,它会向所有参与者发送消息以回滚其工作。 协调者不等待对此消息的确认,而是继续关闭事务并将其从共享内存中删除。 如果参与者尝试确定此事务的状态,也就是说,确定事务是提交还是回滚(例如,在参与者恢复期间) - 在共享内存中找不到任何事务状态。 参与者必须将此解释为意味着事务被回滚。