`
fxly0401
  • 浏览: 148820 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)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容器事务。
六、其它事务概念
1)声明式事务
       声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。
       Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
    Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
       1.传播行为
        2.隔离级别
        3.只读提示
        4.事务超时期间
2)分布式事务
       分布式事务处理(Distributed Transaction Processing,DTP)
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
3)数据源与连接池
      数据源解决的是连接不同类型数据库和修改连接参数的麻烦。
      连接池解决的是对数据库连接的管理,合理利用资源,提高性能。
       它们处于不同的层次,每个层次都可以不同的方式实现。
更多 : http://www.educity.cn/it/sun/200904071029371466.htm
分享到:
评论

相关推荐

    Java基础:Java事务处理类型-差异总结.htm

    Java基础:Java事务处理类型-差异总结.htm

    java拦截器_类型转换_国际化

    在Java中,类型转换分为自动类型转换和强制类型转换两种。自动类型转换发生在数据范围较小的数据类型赋值给数据范围较大的数据类型时,而强制类型转换则需要程序员显式地使用 `(type)` 进行转换,但可能因数据丢失或...

    java精通+开发案例 经典经典总结

    "java精通+开发案例 经典经典总结"这个主题涵盖了Java学习的核心内容和实战经验,旨在帮助开发者深化对Java的理解并提升开发技能。 一、Java基础 1. 类与对象:Java是面向对象的语言,理解类和对象的概念是基础。类...

    推荐给java程序员以及从java转向php程序猿的一本好书

    Spring是Java企业级应用程序中最广泛使用的开源框架之一,它提供了诸如依赖注入、AOP(面向切面编程)、事务管理、数据访问等多种功能。 首先,书中详细介绍了Spring的依赖注入(DI)机制,这是Spring的核心特性。DI...

    华为java面试题总结

    【华为Java面试题总结】 在Java开发者的眼中,华为无疑是中国IT行业的巨头,其面试流程严谨,技术要求高。这份“华为Java面试题总结”旨在为准备进入华为的Java工程师提供一些关键知识点的梳理和复习指导。以下是对...

    java c/s sql srever oracle转换

    6. **事务管理**:Oracle和SQL Server在事务处理上的API可能会有所不同,需要确保Java代码中的事务控制逻辑适应新的数据库环境。 7. **连接池配置**:在Java应用中,通常会使用连接池来管理数据库连接。需要更新...

    Core Java.JAVA核心技术(中文版)

    - **事务处理**:了解ACID属性,实现事务的提交、回滚和隔离级别设置。 - **结果集处理**:ResultSet的操作,遍历查询结果。 7. **Java高级特性**: - **Lambda表达式**:简化函数式接口的使用,实现匿名内部类...

    JAVA核心知识点整理

    理解它们的差异、性能特点及应用场景至关重要。此外,集合接口如Iterable、ListIterator等也是需要掌握的关键点。 三、JVM Java虚拟机(JVM)是Java程序运行的基石,负责字节码的解析和执行。深入理解JVM内存模型...

    2020 兴业银行Java笔试题

    它是默认的存储引擎,适合处理大量数据并需要事务安全的应用场景。InnoDB使用自适应哈希索引、MVCC(多版本并发控制)来提高并发性能,并实现了redo log和undo log来确保事务的原子性和持久性。 5. Java重载的几种...

    java面试评价表

    - **Java9改进**:比较Java9与Java8的主要差异,重点介绍新特性及优化点。 - **HashMap内部结构**:详解HashMap的数据结构及其实现原理。 - **反射机制**:说明反射的用途及其实现方式,探讨其性能影响及应用场合。 ...

    java实现oracle和sqlserver数据库转换(包含大数据)

    Oracle是知名的高性能关系型数据库,而SQL Server则是Microsoft公司推出的强大数据库解决方案,两者在语法、数据类型以及管理方式上都有所差异。 在Java中实现这样的转换,主要涉及到以下几个关键知识点: 1. **...

    java之JDBC全面总结

    JDBC(Java Database Connectivity)是Java平台中用于与各种数据库交互的一组接口和类,它使得开发者能够用纯Java代码来访问和操作数据库,从而避免了不同数据库之间的语法差异。JDBC API包含两个主要的包:`java....

    函数式编程-haskell-to-java

    - 使用Java 8及更高版本引入的Lambda表达式和Stream API可以帮助实现这些功能。 3. **惰性求值的实现**: - Haskell中的惰性求值机制很难直接在Java中实现。 - 可以通过延迟执行的策略或者使用Stream API来模拟...

    java笔试、面试宝典(总结)

    这份"java笔试、面试宝典(总结)"包含了丰富的资源,包括中兴、华为等知名企业的面试题目,以及相关的学习总结和答案,对毕业生或寻求提升技术能力的开发者来说是一份宝贵的参考资料。 1. **基础语法** - 类与...

    JAVA实现跨数据库服务器数据导出导入功能

    JAVA代码应包含适当的异常处理机制,并考虑使用事务来确保数据的一致性。如果在导入过程中发生错误,可以回滚事务,避免部分导入的数据导致数据不一致。 7. **性能优化**: 为了加快数据迁移速度,可以考虑使用...

    最新JAVA面试题总结之数据库.zip

    本资料“最新JAVA面试题总结之数据库”聚焦于Java与数据库相关的面试知识点,旨在帮助求职者更好地准备数据库相关的面试问题。下面我们将深入探讨其中涉及的一些重要概念和技术。 1. **JDBC(Java Database ...

    Java框架面试题总结

    ### Java框架面试题总结 #### Struts篇 **1. Struts的工作流程** Struts框架是一种基于MVC(Model-View-Controller)架构模式的Java Web应用框架。它的工作流程如下: - **客户端发起请求**:客户端通过浏览器或...

    JDBC事务 JTA事务 传播特性 隔离级别

    在Java编程中,处理事务主要涉及JDBC(Java Database Connectivity)和JTA(Java Transaction API)。理解这些概念对于开发可靠的、高性能的数据库应用至关重要。 首先,让我们从事务的四大特性说起: 1. **原子性...

Global site tag (gtag.js) - Google Analytics