着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加。分布式文件系统、分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛。分布式数据库也是目前使用比较常用的分布式系统之一。

简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是Instance),来支持前端系统数据访问需要的数据库组织结构。各个节点之间相互独立、自我管理(site autonomy)。分布式数据库系统追求的主要目标包括:可用性(availability)、准确性(accuray)、一致性(concurrence)和可恢复性(recoverability)。

在一些横跨多部门、多数据源和多子系统的复杂系统环境下,使用和组织分布式数据库可能是一种低成本且更具有灵活性的解决方案。

1、从Remote Transaction到Distributed Transaction

数据库事务是每一个DBMS最核心关注的问题。在分布式数据库环境下,我们的事务对象可能会横跨多个数据库对象。为了保证ACID的基本事务规则,引入了分布式事务(Distributed Transaction)的概念。首先我们区分一下几个基本的事务类型:

ü Local Transaction本地事务

SQL操作语句数据范围只是限制在本地节点上。

ü Remote Transaction远程事务

事务中进行的增加、修改和删除数据对象,存放在远程Remote端的数据库上。本地数据库对象没有参与到事务范围中去。

ü Distributed Transaction分布式事务

所谓分布式事务,就是事务过程中涉及到对本地和远程对象的增加、修改和删除操作。

这里注意一个问题,我们在这里讨论的分布式事务,是通过数据库自身特性实现的分布式事务特性。目前,很多中间件,如Jboss,都提供了中间件级别的分布式事务支持。这种情况下,中间件会向Oracle提出分布式事务管理权获取,之后的事务管理过程交付给Jboss管理。这种情况不是我们今天要讨论的分布式事务问题。

2、事务对象实体

完全的分布式事务对象是有多个角色的,具体来说有如下几个类型:

ü Client(C)客户端:在分布式事务中,能够获取到远程数据库服务器上对象引用(reference)的结点对象;

ü Server(S)服务器:在分布式事务中,直接被引用,或者被其他节点请求获取到数据的节点对象;

ü Global Coordinator(GC)全局协调节点:是分布式事务启动的节点;

ü Local Coordinator(LC)本地协调节点:引用了其他节点上的数据,来完成自身工作的节点对象。

ü Commit Point Site(CPS)事务提交站点:事务涉及的节点中,具有commit_point_strength参数的站点。它通常是分布式事务中,最重要的一个站点对象。在发生“in-doublt”事务的时候,该站点是不能出现冲突的。

ü Commit_point_strength:是init.ora中的一个初始化参数。用来在分布式环境中确定CPS站点。

SQL> show parameter commit_point;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

commit_point_strength integer 1

注意,上面我们提及的分布式事务涉及对象,是指涉及的节点角色。在通常的Distributed Transaction中,一个实际的node是可以充当多个角色的。

3、Two-Phase Commit二阶段提交

Two-Phase Commit是分布式数据库系统中一个经典事务模型,用于解决多个数据库节点之间在进行事务提交过程中的方式问题。

二阶段提交一共具有两个阶段,分别为准备阶段(Prepare Phase)和提交阶段(Commit Phase)。一个分布式事务,要经历两个阶段过程:

ü 准备阶段Prepare Phase

首先,事务涉及到的各个节点需要确定一个commit point site。同时,全局协调者(Global Coordinator)向所有其他的节点(除了commit point site)发消息,要求进行分布式commit或者rollback动作。

在GC发送消息的过程中,Local Coordinators会将这些消息传播到其依赖的节点上。保证消息可以传到分布式事务涉及到的所有节点对象。

对这些被通知到的节点而言,可能的反馈结果有三个:prepared、abort和read-only nodes。

注意,如果在这个过程中,有节点发出abort过程,整个过程就转入到全局rollback过程。

在反馈结果中,各个节点同时将自己的SCN号发送到Global Coordinator节点。GC来确定出各节点中最大的事务SCN号。

经过了prepared phase,我们就可以进入到commit phase阶段。在prepared phase结束一直到commit phase成功结束期间,除了在commit point site上进行的事务外的其他事务都进入所谓的“in-doubt”状态。

ü 提交阶段commit phase

GC向commit point site通知到对比完的最大的SCN编号。此时,Commit Point Site将进行commit动作或者rollback动作。注意,此时在cps上的锁被释放掉。

如果CPS成功的进行过commit或者rollback动作,它会通知到Global Coordinator进行提交的时间点。

该通知会通过GC/LC的传导机制,传导到所有的节点进行commit/rollback动作。

如果所有的过程全都成功结束,每个语句都在使用相同的SCN进行提交。之后,RECO进程开始进行分布式事务清理过程,清理在“dba_2pc_pending”和“dba_2pc_neighbors”中相应的信息。之后,各个节点进入了“forget”阶段,开始“忘记”事务信息。

ü 忘记阶段forget phase

当全部参与分布式事务的节点都完成了相应的commit或者rollback操作,它们就会通知到commit point site,告知当前事务操作结果。Commit point site就可以forget事务信息了。

各个节点通信并不是直接同cps进行,而是同GC。GC将结果信息告知给commit point site,之后cps将该事务的信息清除掉。

Cps在清除完事务信息之后,通知GC自身已经清楚了分布式事务状态。GC之后就清楚自身上的事务信息。

4、结论

本文是一片纯理论介绍的文章,介绍了Oracle分布式事务模型的内容。

声明:本文转自http://blog.itpub.net/23890223/viewspace-722195/,仅供学习使用。

浅述Oracle分布式事务概念的更多相关文章

  1. oracle分布式事务总结-转载

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  2. oracle分布式事务总结

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  3. 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务

    在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...

  4. 硬核!2w 字长文爆肝分布式事务知识点!!

    前言 分布式事务,是分布式架构中一个绕不开的话题,而什么是分布式事务?为什么要使用分布式事务?分布式事务有哪些实现方案?更是面试时面试官特别喜欢的一个分布式三连炮!同时用XMind画了一张导图记录分布 ...

  5. Album++:分布式事务专辑-基础概念

    (一)基础概念:↓ ↓ ↓ 1.1)什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,"一手交钱,一手交货"就是一个事务的例子,交钱和交货必 须全部成功, 事务才算成功, ...

  6. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  7. 浅谈分布式事务与TX-LCN

    最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使 ...

  8. 分布式事务专题笔记(一) 基础概念 与 CAP 理论

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.基础概念 1.什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是 ...

  9. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

随机推荐

  1. php wampp 访问数据库

    //获取用户信息private function UlikeGetUserInfo($Wechat,$data) { $this->logger("到达UlikeFunction.in ...

  2. 制作EDM 邮件规范

    邮件模板最主要是保证兼容性,很多邮箱的过滤规则不同,因此邮件页面要使用最简单原始的代码实现内容展现. 一,采用table嵌套布局,避免用div布局,因为DIV布局会用到float等浮动样式,一些邮箱会 ...

  3. 纯css实现三角形

    在设计界面的时候,通常需要三角形的图标,一般做法是用图片,其实也可以使用css来实现.如下: 向上的三角形   向右的三角形   向下的三角形   向左的三角形   实现它们的css分别是: .top ...

  4. wdcp/wdlinux一键包的php5.3版本添加Zend.so 和Soap.so

    Wdcp 安装soap扩展 1.首先进入 soap模块的安装文件,wdcp安装包解压对应的php中有,如:/root/miloxi/lanmp/php-5.5.10/ext/soap 2.执行: (1 ...

  5. Python学习笔记五--条件和循环

    5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...

  6. 利用FbinstTool+大白菜u盘工具,制作多系统启动U盘【转】

    一般制作多系统启动盘的教程都会要用到rub4dos+grubinst+ultraiso+msgdiyerl等等工具,一大串的工具列表让人望而生畏.其实大白菜里已经对这些工具做了非常好的封装,利用大白菜 ...

  7. Android隐藏标题栏

    打开程序,在onCreate()方法中添加如下代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved ...

  8. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  9. Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)

    转载:http://www.cuteqt.com/blog/?p=2088 Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对 ...

  10. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...