欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[Oracle] 分布式事务和两阶段提交(2PC)

程序员文章站 2024-02-08 12:34:40
...

分布式事务是指发生在多台数据库之间的事务,Oracle中通过dblink方式进行事务处理,分布式事务比单机事务要复杂的多。大部分的关

分布式事务是指发生在多台数据库之间的事务,Oracle中通过dblink方式进行事务处理,分布式事务比单机事务要复杂的多。大部分的关系型数据库通过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务,下面重点介绍下2PC算法。

1、分布式事务的组成

在分布式事务中,主要有以下几个组成部分:

[Oracle] 分布式事务和两阶段提交(2PC)

在分布式事务中,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外,其它的数据库节点按照以下步骤执行:

2) Commit Phase

在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。参与者在接收到协调者发来的消息后将执行响应的操作。

提交阶段按下面的步骤进行:

3)结束阶段

一般情况下,两阶段提交机制都能较好的运行,当在事务进行过程中,有参与者宕机时,重启以后,可以通过询问其他参与者或者协调者,从而知道这个事务到底提交了没有。当然,这一切的前提都是各个参与者在进行每一步操作时,都会事先写入日志。

唯一一个两阶段提交不能解决的困境是:当协调者在发出commit 消息后宕机,而唯一收到这条命令的一个参与者也宕机了,这个时候这个事务就处于一个未知的状态,没有人知道这个事务到底是提交了还是未提交,从而需要数据库管理员的介入,防止数据库进入一个不一致的状态。当然,如果有一个前提是:所有节点或者网络的异常最终都会恢复,那么这个问题就不存在了,协调者和参与者最终会重启,其他节点也最终会收到commit 的信息。这也符合CAP理论。