rednight
0x2B|~0x2B,That's not a question,Just do it.
posts - 32, comments - 14, trackbacks - 0, articles - 0
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2007年3月
>
日
一
二
三
四
五
六
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
工作学习(11)
日志(3)
随笔档案
2007年4月 (1)
2007年3月 (3)
2007年1月 (6)
2006年12月 (1)
2006年11月 (5)
2006年9月 (4)
2006年8月 (12)
搜索
最新评论
1. re: XA分布式事务处理
评论内容较长,点击标题查看
--天龙
2. re: Cannot Forward a Response that is Already Committed
怎么解决。。。
--qingwei
3. re: Cannot call Connection.commit in distributed transaction
Great!
--qx
4. re: XA分布式事务处理[未登录]
当然可以,只要异构数据库也支持xa接口
--quaff
5. re: XA分布式事务处理
可以异构数据库两阶段事务提交吗?
--柴
阅读排行榜
1. XA分布式事务处理(11401)
2. Cannot Forward a Response that is Already Committed(7013)
3. 世界主要船公司名称及网址(3177)
4. Cannot call Connection.commit in distributed transaction(2482)
5. 批量删除数据库记录(2147)
评论排行榜
1. XA分布式事务处理(6)
2. Cannot Forward a Response that is Already Committed(5)
3. Cannot call Connection.commit in distributed transaction(2)
4. java.lang.InstantiationException: org.apache.tools.ant.Main (1)
5. groupable header table(0)
XA分布式事务处理
Posted on 2007-03-06 10:11
rednight
阅读(11401)
评论(6)
编辑
收藏
在谈到
XA
规范之前,必须首先了解分布式事务处理(
Distributed Transaction Processing
,
DTP
)的概念。
Transaction
,即事务,又称之为交易,指一个程序或程序段,在一个或多个资源如
数据库
或文件上为完成某些功能的执行过程的集合。
LU
人的博客
)vqfhOBA
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
X/Open
组织(即现在的
Open Group
)定义了分布式事务处理模型。
X/Open DTP
模型(
1994
)包括应用程序(
AP
)、事务管理器(
TM
)、资源管理器(
RM
)、通信资源管理器(
CRM
)四部分。一般,常见的事务管理器(
TM
)是交易中间件,常见的资源管理器(
RM
)是数据库,常见的通信资源管理器(
CRM
)是消息中间件。
通常把一个数据库内部的事务处理,如对多个表的操作,作为本地事务看待。数据库的事务处理对象是本地事务,而分布式事务处理的对象是全局事务。
所谓全局事务,是指分布式事务处理环境中,多个数据库可能需要共同完成一个工作,这个工作即是一个全局事务,例如,一个事务中可能更新几个不同的数据库。对数据库的操作发生在系统的各处但必须全部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本身操作是否成功,还要依赖与全局事务相关的其它数据库的操作是否成功,如果任一数据库的任一操作失败,则参与此事务的所有数据库所做的所有操作都必须回滚。
LU
人的博客
8v:d?(~;~$A-Q9V D
一般情况下,某一数据库无法知道其它数据库在做什么,因此,在一个
DTP
环境中,交易中间件是必需的,由它通知和协调相关数据库的提交或回滚。而一个数据库只将其自己所做的操作(可恢复)影射到全局事务中。
XA
就是
X/Open DTP
定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。
XA
接口函数由数据库厂商提供。
XA
与两阶段提交协议
通常情况下,交易中间件与数据库通过
XA
接口规范,使用两阶段提交来完成一个全局事务,
XA
规范的基础是两阶段提交协议。
在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事务分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于上锁状态)。如果由于某种原因数据库无法提交属于自己的事务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。
在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。
以一个全局事务为例,
AP
首先通知交易中间件开始一个全局事务,交易中间件通过
XA
接口函数通知数据库开始事务,然后
AP
可以对数据库管理的资源进行操作,数据库系统记录事务对本地资源的所有操作。操作完成后交易中间件通过
XA
接口函数通知数据库操作完成。交易中间件负责记录
AP
操作过哪些数据库(事务分支)。
AP
根据情况通知交易中间件提交该全局事务,交易中间件会通过
XA
接口函数要求各个数据库做预提交,所有数据库返回成功后要求各个数据库做正式提交,此时一笔全局事务结束。
XA
规范对应用来说,最大好处在于事务的完整性由交易中间件和数据库通过
XA
接口控制,
AP
只需要关注与数据库的应用逻辑的处理,而无需过多关心事务的完整性,应用设计开发会简化很多。
具体来说,如果没有交易中间件,应用系统需要在程序内部直接通知数据库开始、结束和提交事务,当出现异常情况时必须由专门的程序对数据库进行反向操作才能完成回滚。如果是有很多事务分支的全局事务,回滚时情况将变得异常复杂。而使用
XA
接口,则全局事务的提交是由交易中间件控制,应用程序只需通知交易中间件提交或回滚事务,就可以控制整个事务(可能涉及多个异地的数据库)的全部提交或回滚,应用程序完全不用考虑冲正逻辑。
在一个涉及多个数据库的全局事务中,为保证全局事务的完整性,由交易中间件控制数据库做两阶段提交是必要的。但典型的两阶段提交,对数据库来说事务从开始到结束(提交或回滚)时间相对较长,在事务处理期间数据库使用的资源(如逻辑日志、各种锁),直到事务结束时才会释放。因此,使用典型的两阶段提交相对来说会占用更多的资源,在网络条件不是很好,如低速网、网络颠簸频繁,情况会更为严重。
当一个全局事务只涉及一个数据库时,有一种优化方式,即一阶段提交。当
AP
通知交易中间件提交事务时,交易中间件直接要求数据库提交事务,省去两阶段提交中的第一阶段,可以缩短处理一个事务的时间,以提高事务处理的效率。作为两阶段提交的一种特例,与两阶段一样,一阶段提交也是标准的。
Feedback
#
re: XA分布式事务处理
回复
更多评论
2008-01-24 21:03 by
baixch
透彻!
#
re: XA分布式事务处理[未登录]
回复
更多评论
2008-01-25 10:26 by
XXX
妙
#
re: XA分布式事务处理[未登录]
回复
更多评论
2008-09-20 20:19 by
棒棒
如果在第二阶段,某个数据库正式提交数据失败了,这时如何处理?
#
re: XA分布式事务处理
回复
更多评论
2009-07-06 11:18 by
柴
可以异构数据库两阶段事务提交吗?
#
re: XA分布式事务处理[未登录]
回复
更多评论
2009-08-24 16:30 by
quaff
当然可以,只要异构数据库也支持xa接口
#
re: XA分布式事务处理
回复
更多评论
2013-08-26 13:43 by
天龙
# re: XA分布式事务处理[未登录] 回复 更多评论
2008-09-20 20:19 by 棒棒
如果在第二阶段,某个数据库正式提交数据失败了,这时如何处理?
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
Powered by:
BlogJava
Copyright © rednight