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

java 事务管理(spring jdbc jta)

阅读更多
转:http://hi.baidu.com/longrm/blog/item/19218745d0950c3887947323.html
JTA事务管理:

Spring支持JTA事务管理,你可以很方便的直接添加bean而不用再每次都添加重复的事务配置代码,
前提是你使用的应用服务器支持JTA事务(Tomcat不支持),下面以weblogic为例,application.xml:

........
<bean id="currentTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
.......

然后你可以写一个通用的抽象servlet类,在doPost(servlet的直接调用函数)里写上如下面的代码:
JtaTransactionManager txManager = (JtaTransactionManager) ApplusContext
     .getBean("currentTransactionManager");
   DefaultTransactionDefinition def = new DefaultTransactionDefinition();
   def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
   TransactionStatus status = txManager.getTransaction(def);
   boolean bRollback = false;

   try {
    result = execute(request, response);
   } catch (BusinessException be) {
    log.debug(be.getMessage());
            StackTraceElement[] trace = be.getStackTrace();
            for(int i=0; i<trace.length; i++)
            log.debug(trace[i]);
    txManager.rollback(status);
    bRollback = true;
   }

   if (!bRollback)
    txManager.commit(status);

这样你只要每个servlet都继承上面这个类,然后重写excute方法,在配置文件里直接添加bean,就可以不用管事务了!
一旦抛出异常(上面是BusinessException),容器就会自动将事务回滚!

JDBC事务管理:

一般的JDBC事务,通常可以这样处理:

<bean id="txProxyTemplate" abstract="true"    
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
    <property name="transactionManager">   
        <ref bean="transactionManager"/>   
    </property>    
    <property name="transactionAttributes">    
        <props>   
            <prop key="find*">PROPAGATION_REQUIRED, readOnly</prop>    
            <prop key="*">PROPAGATION_REQUIRED</prop>    
        </props>    
    </property>    
</bean>    

<bean id="userManager" parent="txProxyTemplate">    
    <property name="target">    
        <bean class="some.package.UserManagerImpl">    
            <property name="userDAO"><ref bean="userDAO"/></property>    
        </bean>    
    </property>    
</bean> 
 

以后,如果增加新的Service/Manager,则XML配置的增量是这一段:

<bean id="someOtherManager" parent="txProxyTemplate">    
    <property name="target">    
        <bean class="some.package.someOtherManagerImpl">    
        </bean>    
    </property>    
</bean>

每次都要添加这段重复的代码,有点繁琐,可以使用TransactionInterceptor进行一点简化:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource">
    <ref local="dataSource" />
   </property>
</bean>

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
   <property name="transactionManager" ref="transactionManager"/>
   <property name="transactionAttributes">
    <props>
     <prop key="*">PROPAGATION_REQUIRED</prop>
     <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
     <prop key="request*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
   </property>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
   <property name="beanNames">
    <value>*[color=red]Service[/color]</value>
   </property>
   <property name="interceptorNames">
    <list>
     <value>transactionInterceptor</value>
    </list>
   </property>
</bean>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
   <property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>

关键在上面的高亮处,只要类的名字满足*Service的规则,那么它就会对这个类进行事务管理!

如此,我们无需再添加累赘的代码,只要名字满足规则就ok了!

tx:advice 和 aop:config 简化配置事务:

   <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <!-- <tx:method name="*" propagation="true" />-->
        </tx:attributes>

    </tx:advice>

    <aop:config>
        <aop:pointcut id="allManagerMethod"
            expression="execution(* com.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="allManagerMethod" />
    </aop:config>

解释一下(* com.evan.crm.service.*.*(..))中几个通配符的含义:

第一个 * —— 通配 任意返回值类型
第二个 * —— 通配 包com.evan.crm.service下的任意class
第三个 * —— 通配 包com.evan.crm.service下的任意class的任意方法
第四个 .. —— 通配 方法可以有0个或多个参数

综上:包com.evan.crm.service下的任意class的具有任意返回值类型、任意数目参数和任意名称的方法。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





注: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应用使用。


参考资料:

http://eshe.iteye.com/blog/265729 

http://www.iteye.com/topic/19317

http://hi.baidu.com/%B7%E8%C8%CB%D4%BA%B7%E4%D7%D3/blog/item/1b4e42cc07df7f1601e928c5.html
Chapter 9. 事务管理
http://www.kuqin.com/spring2.0_doc/transaction.html
spring+hibernate+tomcat+JTA跨数据库事务
http://www.iteye.com/topic/143326
Spring配置事务在DAO层和SERVICE层:
http://mudid.iteye.com/blog/251357
分享到:
评论

相关推荐

    Java Transaction API (JTA) Version 1.3 JSR-907

    Java JTA 与 JDBC 类似,也是 Java 中的一种规范,JDBC 定义了 Java 应用程序如何访问数据库,而 JTA 则定义 Java 应用程序如何实现分布式事务。 Java 中与数据库相关的技术还包括 JPA,它们都分别提供了一套事务 ...

    spring+jotm 多数据源事务管理(一)jdbc

    JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。 它提供了 JAVA 应用程序的事务支持,而且与 JTA( JAVA 事务 API)兼容。您可以在JOTM home page 了解到更...

    tr-test:atomikos spring activemq jta oracle

    测试atomikos spring activemq jta oracle 为了最大限度地恢复和关闭/重启能力,强烈建议您使用以下 init 依赖项配置 Spring 配置: 使事务管理器依赖于您所有的 JDBC 和 JMS 连接工厂:这可确保在关闭期间事务管理...

    06丨20%的业务代码的Spring声明式事务,可能都没处理正确

    Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API,实现了一致的编程模型,而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式,配合 Spring Boot 的...

    Java开发热门项目

    Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--...

    Spring面试71题与答案

     事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。  异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的...

    spring最小版所需包

    Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--...

    Spring3配置声明式事务

    在Spring3中配置声明式事务比早期版本显得更加简便。只需要几行配置文件+注解就可以实现面向切面的AOP事务

    全网最热spring问题总结.pdf

    事务管理: Spring 提供一个持续的事务管理接口, 可以扩展到上至本地 事务下至全局事务(JTA) 。 异常处理: Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC, Hibernate or JDO 抛出的) 转化为...

    java教程

    Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--...

    深入理解Java事务的原理与应用

    一、什么是JAVA事务 通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的...

    在SPRING中实现事务暂停

    摘要Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的。Spring的声明性事务分离可以应用到任何POJO目标对象,并且包含所有EJB基于容器管理事务中...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...

    Spring in Action(第二版 中文高清版).part2

    6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 ...

    Spring in Action(第二版 中文高清版).part1

    6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 ...

    Spring in Action(第2版)中文版

    6.1.2理解spring对事务管理的支持 6.2选择事务管理器 6.2.1jdbc事务 6.2.2hibernate事务 6.2.3jpa事务 6.2.4jdo事务 6.2.5jta事务 6.3在spring中编写事务 6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...

Global site tag (gtag.js) - Google Analytics