- 浏览: 924330 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (229)
- spring (20)
- myBatis (1)
- javase (31)
- 设计模式 (1)
- jQuery EasyUI (4)
- 编程工具 (8)
- Hibernate (3)
- tomcat (3)
- js (27)
- Jboss (2)
- dom4j (1)
- 操作系统 (5)
- 数据库 (26)
- springmvc (6)
- 程序人生 (5)
- JDBC (1)
- android (6)
- groovy (2)
- memcached (11)
- Nginx (8)
- maven (7)
- javaEE (13)
- jquery (3)
- linux (4)
- 单元测试 (6)
- 算法 (6)
- resin 服务器 (5)
- 缓存 (8)
- slf4j日志 (1)
- resin 服务器;log4j (2)
- 性能调休 (25)
- 网络编程 (10)
- 多线程 (9)
- json (1)
最新评论
-
lliiqiang:
主要原因还是因为html格式太复杂多变了。很难过滤所有的危险代 ...
java 防止xss攻击 -
u011670948:
Mustache模板遍历输出数据 -
u011670948:
Mustache模板遍历输出数据 -
masuweng:
spring @Autowire 的注解默认是按类型注入bean -
masuweng:
spring @Autowire 的注解默认是按类型注入bean
转:http://space.itpub.net/?uid-17203031-action-viewspace-itemid-716756
随着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加。分布式文件系统、分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛。分布式数据库 也是目前使用比较常用的分布式系统之一。
简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是 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 分布式事务模型的内容。
参考文献:mos 13229.1
发表评论
-
数据库树型设计[转]
2017-12-26 16:52 1002转:http://www.cnblogs.com/kissd ... -
[转]解惑 spring 嵌套事务
2017-02-08 19:36 762转:http://www.iteye.com/topic/35 ... -
mysql-java数据映射类型
2017-01-19 14:23 1953Mysql-Java 数据类型映射 My ... -
是否采用读写分离方案
2017-01-03 17:48 1666我们怎么决定,是采 ... -
数据库单表拆分问题
2017-01-03 17:37 3318本期焦点问题:单一数据库内分表 本期多个项目出现了在单一数 ... -
mysql limit性能问题
2016-07-18 16:55 742来看一条sql: SELECT m_id ... -
mysql去重查询
2016-02-19 10:53 894查询一个表有多少个kugouId,去掉重复数据,语句: S ... -
mysql导入导出数据
2015-12-23 12:01 578最近在帮产品做一个导数据的请求,好恶心不想说了。DBA不帮 ... -
springJdbc 插入数据返回主键
2015-11-24 16:22 913public long addMsg(final SysMe ... -
mysql 默认自动更新第一个timestamp字段
2015-09-11 18:01 10671.MySQL默认表的第一个timestamp字段为NOT ... -
简单case when用法
2014-10-14 15:59 1141例子一: 有一个表,数据如: mysql> se ... -
[转]exists真的就比in的效率高吗?
2014-09-23 15:41 881转:http://blog.csdn.net/jwisdom ... -
Union和Union All的区别 [转]
2014-05-28 12:15 879转 : http://blog.csdn.net/ ... -
mysql主从数据库架构[转]
2014-05-22 17:54 764转:sinooyj.iteye.com/blog/12133 ... -
mysql锁[转]
2014-04-24 15:34 824转:http://xu20cn.blog.51cto ... -
spring结合mysql事务注解@Transactional不起作用的问题
2014-04-23 18:04 24268最近遇到的一个比较诡异的问题,貌似各种配置都正确了,事务不 ... -
mysql设置autocommit关闭
2014-04-22 21:15 3638mysql默认开启auto commit,可以,通过这几个 ... -
MySQL 查询缓存[转]
2014-03-25 12:21 557转:http://www.tool.la/MYSQL41/0 ... -
MySQL数据库中缓存管理的思路解析[转]
2014-01-21 21:45 791转:http://tech.it168.com/a2011/ ... -
mysql 的gruop by 关键字特殊情况
2013-10-29 14:08 854mysql 的gruop by 用法,并不遵循标准的sql ...
相关推荐
浅述Oracle数据库迁移应用.pdf
浅述Oracle数据库的备份与恢复方法.pdf
浅述ORACLE EBS R12后台管理新变化.pdf
#资源达人分享计划#
#资源达人分享计划#
浅述智能电网的发展
#资源达人分享计划#
#资源达人分享计划#
浅述人工智能在智能控制领域的应用.docx
网页设计艺术浅述.pdf
视频服务器评价浅述.pdf
浅述测评质量检测.pptx
深度学习技术浅述.pdf
数据挖掘知识浅述.pdf
精品教育教学资料
精品资料(2021-2022年收藏的)浅述八卦象数疗法配方实用操作方法耿文涛.docx
无线上网基础知识浅述.docx
浅述消防应急处置预案.doc
浅述固定资产核算系统.pptx
D2D通信技术浅述.pdf