浅述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/,仅供学习使用。

时间: 2024-10-12 15:27:39

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

oracle分布式事务总结-转载

基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Commit Point Site:在分布事务中,首先执行COMMIT或ROLLBACK操作的站点.一般情况下,应该把存储关键数据的站点作为Commit Point Site.因为Commit Point Site和其它站点不一样,从来不会进入prepared状态,所以不会存在IN-DOUBT事务. 可

分布式-事务

概述 什么事务分布式事务 就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败.本质上来说,分布式事务就是为了保证不同数据库的数据一致性. 分布式事务的产生的原因 数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多个数据库.这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,

kafka实现分布式事务

分布式事务 概念: 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败. 本质上来说,分布式事务就是为了保证不同数据库的数据一致性.实现分布式事务方案有很多种,有阿里的seata,基于tcc的高性能分布式事务框架hmily和lcn等开源框架外,还有基于mq来实现分

浅谈分布式事务与TX-LCN

最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使用的场景很多,先举一个常见的:在微服务系统中,如果一个业务需要使用到不同的微服务,并且不同的微服务对应不同的数据库. 打个比方:电商平台有一个客户下订单的业务逻辑,这个业务逻辑涉及到两个微服务,一个是库存服务(库存减一),另一个是订单服务(订单数加一),示意图如下: 如果在执行这个业务逻辑时没有使用

浅谈分布式事务

前言应用场景 事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性.但是分布式事务处理过程中, 某些场地比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证? 在搜索广告系统中,当用户点击某广告后,除了在点击事件表中增加一条记录外,还得去商家账户表中找到这个商家并扣除广告费吧,怎么保证? 一 本地事务以用户A转账用户B为例,假设有 用户A账户表:A(id,userId,amount) 用户B账户表:B(id,userId,amount

浅谈分布式事务(转)

现今互联网界,分布式系统和微服务架构盛行.一个简单操作,在服务端非常可能是由多个服务和数据库实例协同完成的.在一致性要求较高的场景下,多个独立操作之间的一致性问题显得格外棘手.基于水平扩容能力和成本考虑,传统的强一致的解决方案(e.g.单机事务)纷纷被抛弃.其理论依据就是响当当的CAP原理.往往为了可用性和分区容错性,忍痛放弃强一致支持,转而追求最终一致性.分布式系统的特性在分布式系统中,同时满足... 现今互联网界,分布式系统和微服务架构盛行.一个简单操作,在服务端非常可能是由多个服务和数据库

微服务浅述---架构演进

微服务浅述---架构演进 提到架构演进,我们很容易想到'单体应用---分布式/SOA---微服务'的演进过程,那么为什么会有这个必然演进?演进的过程中遇到了哪些坑?是怎么解决这些坑的? 为什么会有这个必然的架构演进? 因为痛点驱动.因为互联网公司很容易突然爆发,今年的数据量可能比去年的数据量翻上N倍.那么刚开始的时候公司用的是单体架构,即一个业务逻辑一撸到底.比如电商公司,从前端商品展示,购物车,下单,订单生成,发货,物流等等这些业务逻辑 全部写在一个工程内,数据放在一个库内,部署在一个服务器上

【故障处理】分布式事务ORA-01591错误解决

[故障处理]分布式事务ORA-01591错误解决 1  BLOG文档结构图       2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 分布式事务的简单概念         ② ORA-01591错误解决   Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(x

分布式事务:两段式提交(最终一致性)

[MySQL如何实现分布式事务?] http://www.linuxidc.com/Linux/2013-10/91925.htm Innodb存储引擎支持XA事务,通过XA事务可以支持分布式事务的实现.分布式事务指的是允许多个独立的事务资源(transac tional resources)参与一个全局的事务中.事务资源通常是关系型数据库系统,也可以是其它类型的资源. 全局事务要求在其中所有参与的事务要么全部提交,要么全部回滚,这对于事务原有的ACID要求又有了提高.另外,在使用分布式事务时候