分布式事务是指发生在多台数据库之间的事务,Oracle中通过dblink方式进行事务处理, 分布式事务比单机事务要复杂的多。大部分的关系型数据库通过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务,下面重点介绍下2PC算法。
1、分布式事务的 组成
在分布式事务中,主要有以下几个组成部分:
Client:调用其它数据库信息的节点
Database:接受来自其它节点请求的节点
Global Coordinator (GC):发起分布式事务的节点
Local Coordinator (LC):处理本地事务,并和其它节点通信的节点
Commit Point Site (CPS):被Global Coordinator指定首先提交或回滚事务的节点
在分布式事务中,Commit Point Site非常重要,它不需要进入2PC的Prepared 状态,因 为它通常操作最关键数据,所以它不会出现in-doubt状态。Commit Point Site总是优先于其 它数据库节点先提交,目的在于保护最关键的数据,它决定整个分布式事务是提交还是回滚 。分布式事务中其它数据库节点在GC的指挥下进行后续的提交(或回滚)。
那么在Oracle中如何选取Commit Point Site呢?它是根据参数commi_ point_strength 最大的数据库作为Commit Point Site。
2、两阶段提交(2PC)
两阶段提交协议可以保证数据的强一致性,许多分布式关系型数据管理系统采用此 协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回滚) 的分布式算法。同时也是解决一致性问题的算法。该算法能够解决很多的临时性系统故障( 包括进程、网络节点、通信等故障),被广泛地使用。但是,它并不能够通过配置来解决所 有的故障,在某些情况下它还需要人为的参与才能解决问题。
顾名思义,两阶 段提交分为以下两个阶段:
1)Prepare Phase (准备节点)
2)Commit Phase (提交阶段)
1)Prepare Phase
在请求阶段,协调者将通知事务参 与者准备提交或取消事务,然后进入表决过程。在表决过程中,参与者将告知协调者自己的 决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。
为了完成准准备阶段,除了commit point site外,其它的数据库节点按照以下步骤执行:
每个节点检查自己是否被其它节点所引用,如果有,就通知这些节点准备提交(进入 Prepare阶段)。
每个节点检查自己运行的事务,如果发现本地运行的事务没有修改数据的操作(只读), 则跳过后面的步骤,直接返回一个read only给全局协调器。
如果事务需要修改数据,则为事务分配相应的资源用于保证修改的正常进行。
当上面的工作都成功后,给全局协调器返回准备就绪的信息,反之,则返回失败的信息。