`
keren
  • 浏览: 1583170 次
  • 性别: 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
分享到:
评论

相关推荐

    spring + JTA + JOTM实现分布式事务

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    在Spring中使用JTA事务管理

    在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...

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

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

    springboot整合JTA组件,多数据源事务管理

    XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。 JTA事务比JDBC事务更强大。一个JTA事务...

    Spring对JDBC的支持jar包.rar

    5. 支持多种事务管理器:Spring支持JTA(Java Transaction API)进行分布式事务管理,以及如DataSourceTransactionManager和HibernateTransactionManager等特定数据源的事务管理器。 通过结合这两个jar包,开发者...

    struts1.x+spring+jta集成例子(包含所有jar包)

    在Struts1.x和JTA的集成中,Spring主要扮演了管理bean、事务以及与JTA交互的角色。通过Spring的ApplicationContext,我们可以方便地配置和管理服务层的bean,包括事务策略。 JTA是Java平台的标准API,用于管理...

    Spring+iBatis+JOTM实现JTA事务

    在分布式系统中,JTA(Java Transaction API)事务管理用于处理跨越多个数据源的事务,如数据库、消息队列等。JOTM(Java Open Transaction Manager)是一个开源的JTA事务管理器,可以在非J2EE环境下提供分布式事务...

    跨数据库的事务管理配置jta

    在提供的XML配置示例中,我们可以看到Spring框架是如何配置两个不同的数据源,并为它们设置JTA事务管理器的。 ##### 数据源配置 首先,我们来看数据源的配置部分: ```xml ...

    spring_如何管理事务的

    - `JTATransactionManager`:用于Java Transaction API (JTA)环境下的事务管理。 ##### 2. 使用示例 ```java // 创建事务定义 TransactionDefinition td = new DefaultTransactionDefinition(); // 获取事务管理...

    java事务设计策略

    本文详细介绍了Java事务设计策略中的关键技术点,包括事务的基本概念、Java事务管理机制、设计模式以及高级技巧。通过对这些知识点的理解和应用,开发者能够在构建Java应用时更加高效地管理事务,确保数据的一致性和...

    初级JDBC需要的jar包,spring数据库开发

    在Java世界里,JDBC(Java Database Connectivity)是Java程序连接和操作数据库的标准接口,而Spring框架提供了一种更高级、更便捷的方式来管理JDBC操作,通过其Spring JDBC模块。 描述中反复提到了"spring初级JDBC...

    Spring+JOTM 分布式事务管理

    Spring的`PlatformTransactionManager`接口是所有事务管理器的基类,如JDBC的DataSourceTransactionManager和JTA的JtaTransactionManager。 **2. JOTM介绍:** JOTM是Java开放事务管理器,是一个开源的、符合JTA...

    基于java的企业级应用开发:Spring事务管理概述.ppt

    在企业级应用开发中,Java 平台上的Spring框架提供了强大的事务管理机制,极大地简化了事务处理过程,降低了开发人员的负担。Spring的事务管理主要围绕三个核心接口展开:PlatformTransactionManager、...

    Java事务的简单代码

    在实际应用中,Java事务管理可能会更复杂,包括使用Spring框架的@Transactional注解进行声明式事务管理,或者使用JTA(Java Transaction API)进行分布式事务处理。这些高级概念允许在多线程和分布式环境中更好地...

    spring+hibernate+jta demo

    而JTA则是Java平台中用于管理分布式事务的标准API。本文将详细介绍如何在MyEclipse环境中将这三者整合,实现一个完整的DEMO。 一、Spring框架 Spring的核心在于IoC容器,它负责管理应用对象的生命周期和依赖关系。...

    JAVA事务配置总结

    在Java中,我们可以使用JDBC的Connection对象的commit()和rollback()方法来手动管理事务,或者利用Java Transaction API (JTA)的UserTransaction接口进行声明式事务管理。在Spring框架中,可以使用@Transactional...

    spring事务管理.doc

    Spring 事务管理是Java开发中一个重要的组成部分,特别是在企业级应用中,确保数据一致性与安全性。Spring 提供了丰富的工具和策略来处理事务,既支持声明式事务管理,也支持编程式事务管理。 首先,事务处理的核心...

    springboot+jta+atomikos

    本项目“springboot+jta+atomikos”旨在利用Spring Boot框架、Java Transaction API (JTA) 和 Atomikos 这一开源事务管理器来实现分布式事务的统一管理。下面将详细阐述这三个关键组件以及它们如何协同工作。 **...

    Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理

    标题中的“Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理”揭示了一个集成开发环境,用于构建分布式、事务一致性的Java应用程序。这个组合利用了Spring框架的依赖注入和AOP(面向切面...

    Spring分布式事务实现

    总结来说,Spring分布式事务实现主要依赖于Spring框架的事务管理能力、JOTM作为JTA实现的事务管理器,以及相关的JDBC驱动来连接数据库。通过声明式事务管理,开发者可以在不深入事务管理细节的情况下,编写出可靠的...

Global site tag (gtag.js) - Google Analytics