理理“事务”(下)

 接上一篇博客《理理“事务”(上)

2.2 分布式事务


        分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。

        有的应用程序会将数据存储到不同的数据库,而这些数据库并不在同一个计算机上。非常明显,对于健全的业务应用程序开发来说,需要某种类型的抽象以便管理单一事务中的多个资源,这就是事务管理器(transaction manager),在幕后协调事务和多个分布式资源的组件。

                             


2.2.1 XA规范


        实现分布式事务处理的关键是采用一种手段保证事务涉及的所有数据库所做的全部动作要么全部生效,要么全部回滚。为了协调多个事务资源的分布式事务处理,多个事务资源底层必须使用一种通用的事务协议,目前流行的分布式事务处理规范就是XA规范。

       X/Open组织定义了分布式事务处理模型。X/Open DTP模型包括应用程序(AP)、事务管理器(TM)、资源管理器(RM)、通信资源管理器(CRM)4部分。一般来说,常见的事务管理器(TM)就是事务中间件(通常由应用服务器来实现),常见的资源管理器(RM)是数据库,常见的通信资源管理器(CRM)是消息中间件。

        X/Open 组织为分布式事务处理指定了事务中间件与数据库之间的接口规范,这种规范就是XA规范。事务中间件用它来通知数据库事务的开始、提交或回滚等。X/Open组织仅仅指定了分布式事务处理的XA规范,但具体的实现则由不同的数据库厂商自行提供,比如Oracle、SQL Server都提供了支持XA规范的驱动。


2.2.2 两阶段提交协议


        XA规范的理论基础就是两阶段提交(2Phase Commit,2PC)协议,该协议定义了单个的事务管理器如何协调和管理一个或多个数据库的局部事务。

分布式事务协议是XA协议。Java EE使用此协议实现分布式事务服务。

                                            

                                                   


2.2.3 JTS 事务服务


        Java EE应用服务器通过Java事务服务(Java Transaction Service,JTS)来实现事务管理器。但是应用程序代码无法直接调用JTS方法,它只需面向JTA方法即可,由JTA来调用底层的JTS进行处理。


2.2.4 JTA事务


        JTA(Java TransactionAPI)是由Java EE 事务管理器(Transaction Manager)去管理的事务。其最大的特点是调用UserTransaction接口的begin、commit和rollback方法来完成事务范围规定的界定、事务的提交和回滚。JTA可以实现统一事务对应不同的数据库

     JTA主要用于分布式的多个数据源的两阶段提交的事务。JTA事务因为其分布式和多数据源的特性,不可能由任何一个数据源实现事务,因此,JTA中的事务是由“事务管理器”实现的,它会在多个数据源之间统筹事务,具体使用的技术就是所谓的“两阶段提交”。

      JTA提供了跨Session的事务管理能力。这一点是与JDBC Transaction最大的差异。JDBC的事务周期限于Connection的生命周期之内。同样,对于基于JDBC Transaction的Hibernate事务管理机制而言,事务管理是在Session所依托的JDBC Connection中实现,事务周期限于Session的生命周期。

        JTA事务管理则由JTA容器实现。JTA容器对当前加入事务众多的Connection进行调度,实现事务性要求。JTA的事务周期可横跨多个JDBCConnection生命周期。同样的,对于基于JTA事务的Hibernate而言,JTA事务横跨多个Session生命周期。


2.3 容器事务


        容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

        容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码。——这段话可以在学习EJB的时候再看。

        EJB与JTA耦合在一起了(EJB容器管理事务CMT)。

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值