- 浏览: 25911 次
文章分类
最新评论
事务处理总结
XA分布式事务处理
来源:http://www.blogjava.net/rednight/archive/2007/03/06/102070.html
在谈到 XA 规范之前,必须首先了解分布式事务处理( Distributed Transaction Processing , DTP )的概念。 Transaction ,即事务,又称之为交易,指一个程序或程序段,在一个或多个资源如 数据库 或文件上为完成某些功能的执行过程的集合。
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
X/Open 组织(即现在的 Open Group )定义了分布式事务处理模型。 X/Open DTP 模型( 1994 )包括应用程序( AP )、事务管理器( TM )、资源管理器( RM )、通信资源管理器( CRM )四部分。一般,常见的事务管理器( TM )是交易中间件,常见的资源管理器( RM )是数据库,常见的通信资源管理器( CRM )是消息中间件。
通常把一个数据库内部的事务处理,如对多个表的操作,作为本地事务看待。数据库的事务处理对象是本地事务,而分布式事务处理的对象是全局事务。
所 谓全局事务,是指分布式事务处理环境中,多个数据库可能需要共同完成一个工作,这个工作即是一个全局事务,例如,一个事务中可能更新几个不同的数据库。对 数据库的操作发生在系统的各处但必须全部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本身操作是否成功,还要依赖与全局事务相关的其它 数据库的操作是否成功,如果任一数据库的任一操作失败,则参与此事务的所有数据库所做的所有操作都必须回滚。
一般情况下,某一数据库无法知道其它数据库在做什么,因此,在一个 DTP 环境中,交易中间件是必需的,由它通知和协调相关数据库的提交或回滚。而一个数据库只将其自己所做的操作(可恢复)影射到全局事务中。
XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。
XA 与两阶段提交协议
通常情况下,交易中间件与数据库通过 XA 接口规范,使用两阶段提交来完成一个全局事务, XA 规范的基础是两阶段提交协议。
在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预 提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事 务分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于上锁状态)。如果由于某种原因数据库无法提交属于自己的 事务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。 在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。
以一个全局事务为例, AP 首先通知交易中间件开始一个全局事务,交易中间件通过 XA 接口函数通知数据库开始事务,然后 AP 可以对数据库管理的资源进行操作,数据库系统记录事务对本地资源的所有操作。操作完成后交易中间件通过 XA 接口函数通知数据库操作完成。交易中间件负责记录 AP 操作过哪些数据库(事务分支)。 AP 根据情况通知交易中间件提交该全局事务,交易中间件会通过 XA 接口函数要求各个数据库做预提交,所有数据库返回成功后要求各个数据库做正式提交,此时一笔全局事务结束。
XA 规范对应用来说,最大好处在于事务的完整性由交易中间件和数据库通过 XA 接口控制, AP 只需要关注与数据库的应用逻辑的处理,而无需过多关心事务的完整性,应用设计开发会简化很多。 具体来说,如果没有交易中间件,应用系统需要在程序内部直接通知数据库开始、结束和提交事务,当出现异常情况时必须由专门的程序对数据库进行反向操作才能完成回滚。如果是有很多事务分支的全局事务,回滚时情况将变得异常复杂。而使用 XA 接口,则全局事务的提交是由交易中间件控制,应用程序只需通知交易中间件提交或回滚事务,就可以控制整个事务(可能涉及多个异地的数据库)的全部提交或回滚,应用程序完全不用考虑冲正逻辑。
在一个涉及多个数据库的全局事务中,为保证全局事务的完整性,由交易中间件控制数据库做两阶段提交是必要的。但典型的两阶段提交,对数据库来说事务从开 始到结束(提交或回滚)时间相对较长,在事务处理期间数据库使用的资源(如逻辑日志、各种锁),直到事务结束时才会释放。因此,使用典型的两阶段提交相对 来说会占用更多的资源,在网络条件不是很好,如低速网、网络颠簸频繁,情况会更为严重。
当一个全局事务只涉及一个数据库时,有一种优化方式,即一阶段提交。当 AP 通知交易中间件提交事务时,交易中间件直接要求数据库提交事务,省去两阶段提交中的第一阶段,可以缩短处理一个事务的时间,以提高事务处理的效率。作为两阶段提交的一种特例,与两阶段一样,一阶段提交也是标准的。
JDBC: public String executeActu(){
try{
TransactionContext.beginTransaction();
validateParam();
String sign=createChangeSign()+flag;
if(!changeSign.equals(sign)){
throw new SignExp();
}
if(checkActuData())
throw new MoreSameOrderExp("不能重复提交,请等待客服审核");
doActu();
TransactionContext.commitTran();
return SUCCESS;
}catch (Exception e) {
TransactionContext.rollbackTran();
log.error("实名认证", e);
setErrorMsg(e.getMessage());
return INPUT;
}
}
发表评论
-
NIO IO区别
2014-01-07 16:12 654转载一篇 我的新书《代码之谜》会有专门的章节 ... -
Spring集成Quartz定时任务框架介绍和Cron表达式详解
2013-01-16 09:25 761在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生 ... -
ClassLoader 与 class
2012-07-03 15:09 1067ClassLoader一个经常出现又让很多人望而却步的词,本文 ... -
转载一篇Java Properties
2012-06-11 18:19 761http://tech.techweb.com.cn/thre ... -
java 线程
2012-05-23 18:07 790http://zhidao.baidu.com/questio ... -
java 并发学习
2012-05-23 11:04 757http://snake1987.iteye.com/blog ... -
MessageDigest使用 完成MD5加密
2012-05-20 13:17 851Java 加密技术:消息摘 ... -
md5加密算法
2012-05-20 13:13 845以下是搜索网上的资料所谓MD5,即"Message- ... -
Class.forName与DriverManager区别
2012-05-17 08:52 6519在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里 ...
相关推荐
### Java OOP 总结资料知识点详解 #### 面向对象编程(OOP)的核心概念与原则 **一、抽象与封装** 1. **面向对象设计的过程:** - **发现类:** 定义出系统中参与交互的基本实体。 - **发现类的属性:** 确定每个类...
在Java中,“线程”通常指代两个不同的事物: 1. `java.lang.Thread` 类的一个实例。 2. 线程的执行。 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。`Thread` 类实例...
本文档是关于软件工程师程序员Java面试题和答案的总结,涵盖了Java语言的特点、面向对象和面向过程的区别、基本数据类型、标识符的命名规则、instanceof关键字的作用、Java自动装箱与拆箱等知识点。 一、Java语言的...
### 总结 Java事务设计策略涉及多个层面,从理论概念到具体实践,都需要开发者具备深刻的理解和谨慎的设计。无论是选择编程式事务管理还是声明式事务管理,抑或是采用特定的事务设计模式,关键在于根据应用程序的...
### Java面向对象思想总结 #### 一、面向对象三大特征 **1. 封装** - **定义**:封装是指将类的属性隐藏起来,仅通过公共方法来访问这些属性的过程。这种做法不仅可以保护数据不被非法修改,还可以在方法中加入...
Java基础知识大总结涵盖了Java编程语言的核心概念和结构,为初学者提供了一个全面的参考资料。下面将详细解析这些知识点: 1. JVM、JRE和JDK的区别: - JVM(Java Virtual Machine)是Java虚拟机,它是Java程序跨...
### Java面向对象总结 #### 学习方法介绍:四问法 - **什么?** 面对一个概念时,首先要明确它是什么。 - **有什么特点?** 掌握其特性,了解它与其他概念的不同之处。 - **怎么用demo?** 通过示例来展示如何实际...
以下是关于Java基础知识的详细总结: 首先,我们讨论Java的运行机制。Java源代码首先由Java编译器(javac)编译成字节码(.class文件),这是一种平台无关的中间表示。字节码在Java虚拟机(JVM)上运行,JVM将字节...
- **面向对象:** Java采用了面向对象的编程范式,一切皆视为对象,通过对象来抽象现实世界的事物,从而更好地组织代码结构。 **2. 学习Java基础:** - **理解规则:** 熟练掌握Java的基本语法和编程规则是学习的第...
类:一组类型相同事物高度抽象之后的集合概念 创建对象的模板 -》 class 对象:类的一个具体的实例 例子: 人和范冰冰之间的关系? 类和对象 HelloKitty和猫之间的关系? 对象和类 引用:对象的名字 *:一个...
Java基础面试总结主要涵盖了几大核心知识点,包括Java面向对象的四大特性——抽象性、封装性、继承性和多态性,以及JVM优化等相关内容。下面我们将深入探讨这些主题。 首先,面向对象的抽象性是软件开发的基础。...
2. **类与对象**:Java是基于类的,意味着程序中的所有事物都是对象。类是对象的蓝图,包含了数据(字段/成员变量)和行为(方法)。对象是类的实例,通过new关键字创建。 3. **控制流**:包括if条件语句(用于单个...
Java基础知识总结(超详细整理) 本总结涵盖了Java基础知识的主要方面,包括Java语言的特点、变量、数据类型、运算符、流程控制语句、数组等。 Java语言的特点 1. 面向对象:Java语言的基础,也是Java语言的重要...
【JAVA学习笔记总结】 在Java编程语言中,面向对象编程是一种核心的概念,它与面向过程编程有所不同。面向过程编程以函数或步骤为中心,而面向对象编程则是以对象为中心,强调数据和行为的封装。在面向对象编程中,...
### Java面向对象知识点总结 #### 1. 类与对象 **1.1 类** - **概念**: 类是用来描述一类事物的共性内容的抽象模型。 - **创建**: 创建类时,需要考虑该类所描述的对象应该具备哪些属性(特征)和行为(功能)。 ...
5. 面向对象:Java的核心是面向对象编程,它将现实世界中的事物抽象为类,类的实例称为对象。类包含了对象的属性(特征)和行为(方法)。对象是类的具体实例,通过实例化将抽象的类转化为具体存在的实体。 在Java...
Java面向对象编程(Object-Oriented Programming,简称OOP)是Java编程的核心,它是一种将现实世界中的事物抽象为程序中的对象的编程方法。在Java OOP中,我们通过类(Class)、对象(Object)、封装(Encapsulation...