您的位置:首页 > 其它

分布式事务-两阶段提交的错误恢复

2013-04-26 00:18 204 查看
原文链接: http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.2pc.doc%2Fdoc%2Fc0005034.html

两阶段提交的错误恢复(Error recovery during two-phase commit)

错误恢复是应用程序编程、系统管理和运维的一个常见任务。对于部署在多个远程服务器上的分布式数据库而言,发生网络和通信故障的概率更高。为了确保数据完整性,数据库管理员提供了两阶段提交流程。下面解释了DBA如何处理两阶段提交过程中发生的错误:

阶段1错误

如果一个数据库说它没有准备好提交工作单元,数据库客户端将在提交过程的第二阶段回滚该工作单元。这种情况下将不会发送prepare消息给事务管理器数据库。
在第二阶段,客户端发送一个rollbak消息给所有参与的并且在第一阶段成功准备好的数据库。然后每个数据库写一个“ABORT”记录到日志文件,并释放被这个工作单元占用的锁。

阶段2错误

这一阶段的错误处理依赖于第二阶段是提交还是回滚事务。如果第一阶段碰到了错误,第二阶段只会回滚事务。
如果一个参与的数据库提交工作单元失败(可能是由于通信失败),事务管理器数据库将尝试在提交失败的数据库上重新提交。如提交成功,应用程序将会被SQLCA通 知到。DB2®数据库在Linux,Unix,Windows平台上将确保数据库服务器中未提交的事务最终被提交。数据库管理器配置参数resync_interval用于指定重新提交的时间间隔。所有的数据库锁都被保留,直到工作单元被成功提交。

如果事务管理器数据库发生失败,它在重启的时候会重新同步这个工作单元。这个重新同步的过程会尝试完成所有的未完成事务(indoubt transactions);也就是,那些第一阶段已经成功完成,但第二阶段提交过程还没完成的事务。重新同步执行以下的步骤:连接那些在第一阶段准备好提交(PREPARED)的数据库
尝试在那些数据库上提交未完成事务(indoubt transactions)。(如果没找到未完成交易,数据库管理器假设数据库第二阶段的提交已成功完成。)
当所有参与数据库的未完成事务都被成功提交后,再在事务管理器数据库上提交未完成事务
如果其中之一的数据库失败并被重启, 该数据库的数据管理器将从事务管理数据库查询该事务的状态, 以决定是否应该回滚该事务. 如果没有在日志中发现该事务, 数据库管理器假定事务被回滚了, 并且将回滚在这个数据库中的未完成的事务. 否则, 数据库会等待从事务管理数据库发来一个提交请求.
如果这个事务是被一个事务处理监控器(XA兼容事务管理器), 数据库将总是依赖于这个TP监控器来发起同步.如果, 因为某些原因, 你不能等待事务管理器来自动解决未完成事务, 你可以采取一些操作来手动解决问题. 这个操作指南通常被称为"启发式决定"(making a heuristic decision).

在autorestart=off时的错误恢复

如果autorestart数据库配置参数设置为OFF,并且在TM或RM数据库中存在未完成的事务,那么启动重新同步过程需要执行RESTART DATABASE命令。当从命令行处理器执行RESTART DATABASE命令时,要使用不同的会话。如果你从同一个会话(session)重起不同的数据库,先前调用建立的连接将被丢弃,必须重新启动一次。执行TERMINATE命令后,当LIST INDOUBTTRANSACTION命令返回不再有未完成的交易时, 执行TERMINATE命令来丢弃这个连接。

by iefreer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: