`

java事物总结

 
阅读更多

事务处理总结

一、什么是Java 事务
通常的观念认为,事务仅与数据库 相关。
事 务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示 当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持 久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL 指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码 中。因此,数据库操作的事务习惯上就称为Java事务。
二、为什么需要事务
事 务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B账户 下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失 败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加方到 一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性 
三、Java事务的类型
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
1、JDBC事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
2、JTA(Java Transaction API)事务
JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。
JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
如 果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。
您将需要用应用服务器的管理 工具设置 XADataSource 。从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导。
J2EE 应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection() 以获得到数据库的连接。
XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。相反,应用程序应该使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
3、容器事务
容 器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事务管理,我 们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方法加入事 务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容 器去解决。使用EJB CMT的另外一个好处就是程序员 无需关心JTA API的编码,不过,理论上我们必须使用EJB。
四、三种事务差异
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
五、总结
事 务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。

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;
        }
    }

分享到:
评论

相关推荐

    javaOOP总结资料

    ### Java OOP 总结资料知识点详解 #### 面向对象编程(OOP)的核心概念与原则 **一、抽象与封装** 1. **面向对象设计的过程:** - **发现类:** 定义出系统中参与交互的基本实体。 - **发现类的属性:** 确定每个类...

    java多线程编程总结

    在Java中,“线程”通常指代两个不同的事物: 1. `java.lang.Thread` 类的一个实例。 2. 线程的执行。 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。`Thread` 类实例...

    软件工程师 程序员10万字大厂应聘面试总结java面试题和答案.pdf

    本文档是关于软件工程师程序员Java面试题和答案的总结,涵盖了Java语言的特点、面向对象和面向过程的区别、基本数据类型、标识符的命名规则、instanceof关键字的作用、Java自动装箱与拆箱等知识点。 一、Java语言的...

    Java事物设计策略

    ### 总结 Java事务设计策略涉及多个层面,从理论概念到具体实践,都需要开发者具备深刻的理解和谨慎的设计。无论是选择编程式事务管理还是声明式事务管理,抑或是采用特定的事务设计模式,关键在于根据应用程序的...

    Java面向对象思想总结

    ### Java面向对象思想总结 #### 一、面向对象三大特征 **1. 封装** - **定义**:封装是指将类的属性隐藏起来,仅通过公共方法来访问这些属性的过程。这种做法不仅可以保护数据不被非法修改,还可以在方法中加入...

    java基础知识大总结

    Java基础知识大总结涵盖了Java编程语言的核心概念和结构,为初学者提供了一个全面的参考资料。下面将详细解析这些知识点: 1. JVM、JRE和JDK的区别: - JVM(Java Virtual Machine)是Java虚拟机,它是Java程序跨...

    java面向对象总结(绝对经典)

    ### Java面向对象总结 #### 学习方法介绍:四问法 - **什么?** 面对一个概念时,首先要明确它是什么。 - **有什么特点?** 掌握其特性,了解它与其他概念的不同之处。 - **怎么用demo?** 通过示例来展示如何实际...

    java基础总结(非常详细)

    以下是关于Java基础知识的详细总结: 首先,我们讨论Java的运行机制。Java源代码首先由Java编译器(javac)编译成字节码(.class文件),这是一种平台无关的中间表示。字节码在Java虚拟机(JVM)上运行,JVM将字节...

    关于java学习总结.docx

    - **面向对象:** Java采用了面向对象的编程范式,一切皆视为对象,通过对象来抽象现实世界的事物,从而更好地组织代码结构。 **2. 学习Java基础:** - **理解规则:** 熟练掌握Java的基本语法和编程规则是学习的第...

    corejava基础重要知识点总结

    类:一组类型相同事物高度抽象之后的集合概念 创建对象的模板 -》 class 对象:类的一个具体的实例 例子: 人和范冰冰之间的关系? 类和对象 HelloKitty和猫之间的关系? 对象和类 引用:对象的名字 *:一个...

    java基础面试总结

    Java基础面试总结主要涵盖了几大核心知识点,包括Java面向对象的四大特性——抽象性、封装性、继承性和多态性,以及JVM优化等相关内容。下面我们将深入探讨这些主题。 首先,面向对象的抽象性是软件开发的基础。...

    Java基础总结(程序员cxuan编写)1

    2. **类与对象**:Java是基于类的,意味着程序中的所有事物都是对象。类是对象的蓝图,包含了数据(字段/成员变量)和行为(方法)。对象是类的实例,通过new关键字创建。 3. **控制流**:包括if条件语句(用于单个...

    Java基础知识总结(超详细整理)

    Java基础知识总结(超详细整理) 本总结涵盖了Java基础知识的主要方面,包括Java语言的特点、变量、数据类型、运算符、流程控制语句、数组等。 Java语言的特点 1. 面向对象:Java语言的基础,也是Java语言的重要...

    JAVA学习笔记总结

    【JAVA学习笔记总结】 在Java编程语言中,面向对象编程是一种核心的概念,它与面向过程编程有所不同。面向过程编程以函数或步骤为中心,而面向对象编程则是以对象为中心,强调数据和行为的封装。在面向对象编程中,...

    java面向对象知识点总结

    ### Java面向对象知识点总结 #### 1. 类与对象 **1.1 类** - **概念**: 类是用来描述一类事物的共性内容的抽象模型。 - **创建**: 创建类时,需要考虑该类所描述的对象应该具备哪些属性(特征)和行为(功能)。 ...

    JAVA培训总结,重点都有1.pdf

    5. 面向对象:Java的核心是面向对象编程,它将现实世界中的事物抽象为类,类的实例称为对象。类包含了对象的属性(特征)和行为(方法)。对象是类的具体实例,通过实例化将抽象的类转化为具体存在的实体。 在Java...

    JavaOOP思想总结

    Java面向对象编程(Object-Oriented Programming,简称OOP)是Java编程的核心,它是一种将现实世界中的事物抽象为程序中的对象的编程方法。在Java OOP中,我们通过类(Class)、对象(Object)、封装(Encapsulation...

Global site tag (gtag.js) - Google Analytics