Oracle分布式事务处理过程

作者简介:石云华,现就职于北京海天起点,oracle技术二线专家成员,Exadata部门负责人。拥有十余年电信、保险、税务行业核心系统ORACLE数据库运维经验,持有11gOCM、Exadata、Goldengate等证书。擅长于oracle/goldengate/exadata方面的故障诊断及疑难问题处理。

基本概念

如图Oracle为分布式事务定义了会话树,树中的每个节点代表一个数据库服务,所有会话树中的节点都需要承担下列一个或多个角色:

1 客户端(Client)

引用不同数据库节点中数据的节点。

2 数据库服务器(Database server)

响应来自另一节点数据请求的节点。

3 本地协调器(Local Coordinator)

在分布事务中,必须引用其它节点上的数据才能完成自己这部分事务操作的站点。如上图SALES也是一个本地协调器。

4 全局协调器(Global Coordinator)

分布事务的发起者,负责发送所有分布式事务SQL语句与协调整个分布事务。会话树中的根节点为全局协调器。

5 提交点节点(Commit Point Site)

在分布事务提交过程中,首先执行COMMIT或ROLLBACK操作的站点。一般情况下,应该把存储关键数据的站点作为提交点节点。因为提交点节点和其它节点不同,它不会进入prepared状态,所以不会变为IN-DOUBT事务(IN-DOUBT事务定义在三-3中详述)。

在分布式事务中,可以设置初始化参数COMMIT_POINT_STRENGTH。Oracle会根据将COMMIT_POINT_STRENGTH值较大的节点确定为提交点节点。但需要注意的是,只读节点不能成为提交点节点。

事务回滚过程

如果分布式事务以事务回滚结束,数据库不会去确定提交点站点。全局协调器给所有节点发送ROLLBACK语句,然后结束分布式事务处理。

事务提交过程

分布式事务提交过程分为以下几阶段:

执行DML语句

用户登录并执行若干条DML语句,其中每一个节点在执行DML语句过程中为要的数据加锁直至分布式事务完成,从而保证分布式事务中数据的完整性。这个阶段完成分布式事务会话树的定义与构造。

确定提交点节点

用户数用COMMIT语句后,Oracle通过一下几个步骤确认提交点节点:

  1. 对于那些被全局协调器直接引用的点,数据库会选择拥有最高的commit point strength的节点点作为提交点节点。
  2.  最初被选择的点通过获取这个事务中的信息决定会话树的节点中是否存在具有更高的commit point strength的节点。
  3.  不是拥有最高commit point strength的被事务直接引用的节点就是拥有更高commit point strength的服务器端会成为提交点节点。

需要注意的是,只读节点不能成为提交点节点。如果有多个由全局协调器直接引用的节点有相同的commit point strength,那么数据库指定其中之一为提交点节点。

当提交点节点被确认后,进入下一阶段。

全局协调器发送准备响应请求

此阶段也是两阶段提交机制(Two-Phase Commit Mechanism)中的准备阶段。在这个阶段中除了提交点节点以外的节点需要完成以下步骤:

  1. 该节点的请求其后代 ,也就是该节点后来引用的节点,准备提交。
  2. 该节点检查事务是否变动本身或其后代的数据。如果没有数据变化,那么节点跳过其余的步骤,并返回一个只读响应(Read-Only Response),表示该节点无需参与提交。
  3. 如果数据被更改,节点分配需要提交事务的资源。
  4. 节点为事务产生的修改保存相应的重做记录至节点的重做日志。
  5. 节点保证为本次事务持有能够防止产生错误的锁。
  6. 节点返回准备响应(Prepared Response)或者如果它或者它的后代准备失败则返回中止响应(Abort Response,中止响应处理见四-1)。

这些步骤保证节点随后可以提交或回滚节点上的事务。完成准备步骤的节点,之后开始等待直到收到来自全局协调器的COMMIT或ROLLBACK请求。

所有节点完成准备步骤后,分布式的事务则被称作in-doubt的。它维持in-doubt的状态,直到所有的改变都被提交或回滚。

提交点节点提交

第4-6阶段为两阶段提交机制(Two-Phase Commit Mechanism)中的提交阶段,如果所有节点返回准备响应或只读响应则进入提交阶段,否则进行四-1所述的错误处理。这个阶段需要完成以下步骤:

  1. 全局协调器确认所有节点完成准备步骤,并向提交点节点发送事务提交命令。
  2. 提交点节点提交本地事务并记录至本地重做日志。

提交点节点通知全局协调器提交成功

这个阶段需要完成以下步骤:

  1. 提交点节点通知全局协调器事务已经提交完成。
  2. 由全局协调器等待并确定事务已在分布式事务中的所有其他节点上提交。

全局与局部协调器通知所有节点提交事务

这个阶段需要完成以下步骤:

  1. 当提交点节点通知全局协调器事务提交完成之后,全局协调器通知其他直接引用的节点提交事务。
  2. 接着,每个地方协调器命令其服务器提交,以此类推。
  3. 每个节点,包括全局协调器,提交事务并在本地纪录适当重做日志条目。每个节点提交时,释放由于当前事务被锁定资源。

全局协调器与提交点节点完成分布式事务提交

此为两阶段提交机制(Two-Phase Commit Mechanism)中的注销阶段(Forget Phase)。这个阶段需要完成以下步骤:

  1. 所有被应用节点与全局协调器完成事务提交之后,全局协调器将此状态通知提交点节点。
  2. 等待次消息的提交点节点擦除关于此次分布式事务的相关信息。
  3. 提交点站点通知全局协调器擦除信息完成。换句话说,提交点节点忘记了关于此次分布式事务的信息。这个步骤是被允许的,因为在这两阶段提中的所有节点都已经成功提交了事务,因此他们以后也没有必要确定他们在这个事务中的状态了。
  4. 全局协调器定型通过擦除事务本身析构事务。

事务提交过程中的自动错误处理

节点返回中止响应

当有节点无法完成准备提交的步骤并返回中止响应后,将执行以下操作:

  1. 释放事务持有的资源并回滚事务的本地部分。
  2. 给引用他的节点返回一个中止消息。

这些步骤之后会传播到分布式事务所涉及的其他节点当中,使他们可以回滚事务,并保证在全局数据库中的数据完整性。

在准备阶段发生故障

上图描述了一个在分布式事务准备阶段失败时的的事件序列。

如图所示的类似故障发生后,当远端站点回复后,事务最终会被RECO进程在每一个数据库上回滚。

在提交阶段发生故障

上图描述了一个在分布式事务提交阶段失败时的的事件序列。

如图所示的类似故障发生后,当网络修复后,事务最终会被RECO进程在远端数据库上提交。

未经允许不得转载:Oracle一体机用户组 » Oracle分布式事务处理过程

相关推荐