浅述Oracle分布式事务概念
简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是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分布式事务概念的更多相关文章
- oracle分布式事务总结-转载
基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...
- oracle分布式事务总结
基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...
- 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务
在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...
- 硬核!2w 字长文爆肝分布式事务知识点!!
前言 分布式事务,是分布式架构中一个绕不开的话题,而什么是分布式事务?为什么要使用分布式事务?分布式事务有哪些实现方案?更是面试时面试官特别喜欢的一个分布式三连炮!同时用XMind画了一张导图记录分布 ...
- Album++:分布式事务专辑-基础概念
(一)基础概念:↓ ↓ ↓ 1.1)什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,"一手交钱,一手交货"就是一个事务的例子,交钱和交货必 须全部成功, 事务才算成功, ...
- 浅谈Oracle事务【转载竹沥半夏】
浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...
- 浅谈分布式事务与TX-LCN
最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使 ...
- 分布式事务专题笔记(一) 基础概念 与 CAP 理论
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.基础概念 1.什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是 ...
- 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决
浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...
随机推荐
- oracle查询blob类型
下午要查询一个数据,要求是从 表t_report 中查找出 mainbody字段中包含“hibernate”字符串的所有信息.而mainbody字段是blob类型.百度后终于找到答案: DBMS_LO ...
- MySQL如何执行关联查询
MySQL中‘关联(join)’ 一词包含的意义比一般意义上理解的要更广泛.总的来说,MySQL认为任何一个查询都是一次‘关联’ --并不仅仅是一个查询需要到两个表的匹配才叫关联,索引在MySQL中, ...
- C++ Primer 5th 第8章 IO库
IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...
- 【转载】Express、Koa、Hapi框架对比
中文翻译:http://ourjs.com/detail/5490db1c8a34fa320400000e 英文原文:https://www.airpair.com/node.js/posts/nod ...
- jquery读取后台代码
前台代码: <script type="text/javascript"> $(function () { $("#btn") ...
- Android 字体颜色变化(点击)
在开发的过程中,经常会遇到这样的场景,点击按钮,背景颜色发生变化:在drawable中,定义xxx.xml(selector) <selector xmlns:android="htt ...
- ng-options
tr td 地点 td select.form-control(required="true" ng-model="addkc.dd" ng-options=& ...
- Linux标准输入、输出和错误和文件重定向(转) --- good
标准输入.输出和错误 当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名.下面就是这些文 ...
- 【HDOJ】4515 小Q系列故事——世界上最遥远的距离
简单题目,先把时间都归到整年,然后再计算.同时为了防止减法出现xx月00日的情况,需要将d先多增加1,再恢复回来. #include <cstdio> #include <cstri ...
- U-Boot启动过程完全分析
U-Boot启动过程完全分析 1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段 ...