Java事务--概述

来源:互联网 发布:江恩计算器算法 编辑:程序博客网 时间:2024/05/01 02:04
一 什么是Java事务
      1.1 事务概念
      事务,在计算机术语中是指访问并操作数据库中数据项的一个程序执行单元。
      1.2 事务特性
      原子性:原子性指的是事务是一个不可分割的工作单元,事务中的操作要不全部成功,要不什么都不做。比如同一个SQL语句中,要么全部执行,要么全部执行失败。
      一致性:一致性指的是事务必须使数据库从一个状态变换到另一个状态。以转账为例,假设账户A和账户B互相转账,假设转账之前两个用户的钱加起来共1000,那么两个账户无论如何转账,账户A和账户B的钱加起来总额还是1000,这个就是事务的一致性。
      隔离性:隔离性是指多个用户同时访问数据库,数据库为每一个用户开启的事务,不能被其他的事务操作干扰。比如两个事务要同时访问一个数据,第一个事务会给数据加一个锁,其他的事务在第一个事务释放锁之前,不能访问此数据。
      持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
      1.3 Java事务

既然事务的概念从数据库而来,并且事务也是作用于数据库,那什么事Java事务,Java事务和数据库事务有什么联系?

      实际上,一个Java应用程序,不可避免的要使用数据库,通常我们将程序的逻辑放到了Java代码中,所以,事务也应该放到Java程序中,因此在Java程序中数据库操作的事务称为Java事务。

二 Java事务类型
      Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
      2.1 JDBC事务
      在Java程序中,JDBC是直接操作数据库的,所以,持久层的JDBC需要事务支持。JDBC的事务使用Connection对象控制的。JDBC Connection接口提供了两种事务模式:自动提交和手动提交,默认是自动提交。
使用JDBC事务时,可以将多个SQL操作封装到一个Connection中提交。
JDBC事务缺点

      因为JDBC事务使用Connection管理,所以,JDBC的事务局限在了一个数据库连接中,并且不能跨数据库使用。为了支持跨数据库的事务操作,J2EE提供了JTA事务。


      2.2 JTA事务
      JTA是J2EE十三个规范之一,它允许程序执行分布式事务处理--在两个后多个网络资源上访问并且更新数据,这些数据可以分布在多个数据库上。
      JTA的事务分为两种:Local Transaction和Global Transaction。
      涉及到一个Connection的Commit,称为Local Transaction;
      涉及到两个Connection的Commit称为Global Transaction。 
      Local Connection可以使用JDBC的事务实现,Global Transaction事务必须使用JTA实现。Global Transaction需要XA支持,JDBC和数据库本身也需要XA支持。

      JTA缺点:分布式成为目前最流行的架构,分布式的解决方案也是非常多,但是JTA没有实现分布式的事务,目前只有容器事务可以实现分布式事务。


      2.3 容器事务
      EJB有两种使用事务的方式,第一种是通过容器管理的事务,叫做CMT,第二种是通过bean管理的容器,就做BMT。
      MCT中,容易自动提供事务的开始、提交和回滚,总是在业务方法的开始和结束处标记事务的边界。
      BMT中,允许通过编程的方式来指定事务的开始、提交和回滚.

      缺点:如果我们需要使用容器使用,理论上,我们必须使用EJB。


三 三种事务对比
      1、 JDBC事务 优点:直接面对数据库,使用简单;缺点:事务控制局限在一个连接内,不支持多数据库。
      2、 JTA事务 优点:可以跨越多个数据库和持久层;缺点:使用较负责,没有实现分布式事务。
      3、 容器使用,提供了分布式事务;缺点:局限于EJB.
四 总结
      Java事务在程序中不可或缺,但是需要合理使用。如果仅限于单个Connection连接,那么直接选择JDBC事务即可;如果需要跨越多个数据库或者多个持久层Connection,则需要使用JTA;如果使用了分布式系统,并且必须要保证数据准确性和实时性,并且可以使用EJB,建议使用容器事务。
0 0