当前位置:编程学习 > JAVA >>

Java 平台事务管理

JAVA平台事务管理
                                                                                                                           JamesGore119@gmail.com                                                                                                                     


         事务是用户定义的操作序列,是一个逻辑工作单元。事务存在的目的是保证系统的正确性,保证系统对应的数据资源,如数据库、文件系统,以受控的方式操作,所以事务本身具有4个限定属性:原子性、一致性、隔离性、持久性。        

一、     局部事务与全局事务
         一个事务处理场景中,一般包含以下几个角色:

         资源管理者:ResourceManger ,负责存储并管理系统数据资源的状态,如数据库服务器,JMS消息服务器等。

         事务处理监视者:TransactionProcess Monitor,负责分布式事务场景中协调多个RM的事务处理。一般中间件或应用服务器担当此角色。

         事务管理者:TransactionManager,可以认为是TP monitor的核心模块,直接负责RM事务处理,包括事务界定,事务上下文传递等功能。

         应用程序:触发事务的边界点

         事实上,并不是每个事务处理过程都包含这些角色,根据整个事务过程中涉及到资源管理者多少,可以分为局部事务与全局事务。这两类事务,具体的参与者不一样。

1.     全局事务
         如果整个事务处理过程中,包含多个RM,那么就需要引入TP Monitor来协调多个RM之间的事务处理。

 \
 

 

         应用程序提交事务请求,TPMonitor调配之后,由TM统一协调,TM将使用两阶段协议来协调多个RM之间的事务处理。

2.     局部事务
         如果当前事务中有一个资源管理者参与,那么当前事务就是局部事务。比如说一个系统只有一个数据源,或者有多个数据源,但每次事务只涉及到一个数据源。

 

 \
 

         局部事务中只涉及到一个RM,那TP Monitor就没有存在的必要,应用程序直接和RM打交道,通常情况下,RM都有内置的事务支持,如数据库的事务管理。局部事务,实践当中,更倾向使用内置事务支持,减少复杂度与事务开销。

二、     JAVA事务管理
         在程序开发中,我们关心的是通过相应的产品API获取事务资源,考虑在业务逻辑中界定事务边界,并不关心各供应商如何实现事务。JAVA平台提供了各种各样的事务管理API,应用于局部事务场景与全局事务场景。

1.     局部事务支持
         局部事务管理方式,不使用专门的事务管理API,而使用数据访问技术的API进行事务管理,局部事务随着数据访问技术的不同而异。从前面可知,局部事务RM都有内置事务支持,所以局部事务管理是基于数据访问技术所提供,应用程序与数据资源之间通信通道的API来管理事务,也就是说基于连接的API管理事务。

l  JDBC
         JDBC是java平台数据访问最基础的API,基于java.sql.Connection,控制事务的提交与回滚。

         Connection connection = ...

         connnection.setAutoCommit(false)

                   ...

         connection.commit();或connection.rollback();

l  Ibatis\Mybatis
         mybatis是基于jdbc的封装,封装了jdbc模板代码,实现了实体与sql语句之间的映射。

         SqlSession session = sqlSessionFractory.open(false);

                            ...

         session.commit();或session.rollback();

l  Hibernate
         如果说mybatis是实体与sql之间的映射,那么hibernate是实体与表之间的映射。hibernate基于Session进行数据访问的事务管理(可以配置hibernate基于jdbc的局部事务管理,或者使用分布式事务管理)。

         Session session = factory.open();

         Transaction transaction =session.beginTransaction;

                            ...

         transaction.commit(); 或 transaction.rollback();

l  JPA
         JPA是一个持久化规范,hiberante是其中的一种实现方式(也是事实上的标准),其它实现还有TopLink、OpenJPA。JPA基于EntityManage进行事务管理。

         EntityManger em = ...

         em.getTransaction().begin();

                            ...

         em.getTransaction().commit() 或 em.getTransaction().rollback();

l  JMS
         JMS是基于javax.jmx.Session进行事务控制。

                   Session session = ...

                            ...

                   session.commit(); 或 session.rollback();

 

         局部事务管理常常涉及到一的一个问题是“连接”的传递,当在一个服务中包含多次数据访问时,数据访问层必须使用同一个“连接”,这是程序设计需要考虑的问题,否则无法地做到事务的原子性。

         一般有两种思路解决这个问题,一个是参数传递,服务层开启连接(事务),传递给各个数据访问层;另一个是使用Th

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,