浅述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/,仅供学习使用。
转载于:https://www.cnblogs.com/lxxhome/p/5524141.html
浅述Oracle分布式事务概念相关推荐
- 分布式事务概念、理论、及(2PC、3PC)
一. 简介 1. 什么是本地事务? 基于关系型数据库的事务,叫做本地事务,也叫做数据库事务. 本地事务通常是应用和数据库在一个服务器上,利用数据库本身的事务特性,从而实现本地事务. 数据库事务的特性: ...
- 架构设计 | 分布式事务①概念简介和基础理论
本文源码:GitHub·点这里 || GitEE·点这里 一.分布式事务简介 1.转账经典案例 跨地区和机构的转账的业务在实际生活中非常常见,基础流程如下: 账户01通过一系列服务和支付的流程,把钱转 ...
- Oracle 分布式事务 2pc 故障处理
目录
- 分布式事务选型的取舍
来自:DBAplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域. 微服务兴起的这几年涌现出不少分布式事务框架,比如ByteTCC ...
- 分布式事务选型的取舍 | 建议收藏
点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 微服务兴起的这几年涌现出不少分布式事务框架,比如Byte ...
- 分布式事务方案这么多,到底应该如何选型?
戳蓝字"CSDN云计算"关注我们哦! 作者 | 温卫斌 责编 | 刘晶晶 源自 | dbaplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与 ...
- kafka实现分布式事务解决方案
分布式事务 概念: 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成, ...
- 【JAVA秘籍功法篇-分布式事务】事务的实现原理
事务基本概念 什么是事务? 在我们平常使用Mysql等数据库时,经常会遇到事务的提交和回滚等场景.那到底什么是事务呢? 事务是恢复和并发控制的基本单位,事务有四个特性,也是我们常说的ACID,原子性( ...
- 如果你还不知道SAGA,那这篇不容错过!|分布式事务系列(五)
这是分布式事务系列的第五篇,如果之前文章没读请自行前往.精华专题,强烈建议收藏. 本文详细讲解了分布式事务解决方案--SAGA. 点击上方"后端开发技术",选择"设为星 ...
最新文章
- 63.不同的路径II
- OpenMP 编程实例(蒙特卡罗算法)
- bzoj1297 [SCOI2009]迷路(矩阵优化)
- 给自己的Unity添加声音文件
- TreeView控件二(递归算法)
- 2020年跨行业跨领域工业互联网平台
- android 分析boot.img,Android 系统准备知识-bootimg文件的结构
- Altium AD20分屏显示,交叉选择模式使用,原理图和PCB器件的同步选择
- iOS开发之注册推送通知权限
- 面向对象之多态、多态性
- 系统开机 linux 时间不对,linux下查看系统运行时间和最近一次的开机启动时间
- CAD看图软件_CAD图纸管理软件
- NodeJS 微信公共号开发 - 响应微信发送的Token验证(山东数漫江湖)
- docker 运行命令
- 什么样的商业计划书才是投资人喜欢的
- 蚁群算法(实验分析)
- android课程设计健身,健身软件课程设计.doc
- node基础知识部分小记
- java源码 - SpringMVC(9)之 其他Resolver
- SVG实现圆形进度条
热门文章
- 如何确认mongodb数据插入是否成功_go连接mongodb
- vue渲染大量数据如何优化_Vue - Table表格渲染上千数据优化
- idea mybatis generator插件_在idea中使用mybatis generator逆向工程生成代码
- c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...
- java rest 知乎_java 自动化 三分钟带你理解 RESTful
- java frame paint_一个简单的java frame画图(paint)问题
- httpd服务器常见漏洞修复,网站安全监测以及漏洞修复过程
- linux线程超过1024报错,Linux定位c++程序运行异常的经历《实操》
- Linux发布环境,linux发布环境初始化脚本
- Retrofit的动态代理