您的位置:首页 > 编程语言 > Java开发

Java事务(八) - 分布式事务 - spring + JTA + atomikos

2016-10-04 10:06 399 查看
一. 前言:

上一篇博客中,我们使用jotm实现了分布式事务, 本篇将使用atomikos实现。

基本的代码都是一样的,就是配置略有不同。

二. 代码实现:

1. 代码结构图:



2. 配置文件:ApplicationContext.xml

[html] view
plain copy

 





<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

 xmlns:aop="http://www.springframework.org/schema/aop"  

 xmlns:tx="http://www.springframework.org/schema/tx"  

 xsi:schemaLocation=
4000
"http://www.springframework.org/schema/beans   

                     http://www.springframework.org/schema/beans/spring-beans.xsd   

                     http://www.springframework.org/schema/tx   

                     http://www.springframework.org/schema/tx/spring-tx.xsd   

                     http://www.springframework.org/schema/aop   

                     http://www.springframework.org/schema/aop/spring-aop.xsd">  

      

    <!-- 数据库1 -->  

    <bean id="db1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     

        <property name="uniqueResourceName">     

            <value>mysql/main</value>     

        </property>     

        <property name="xaDataSourceClassName">     

            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>     

        </property>     

        <property name="xaDataSourceProperties">     

            <value>URL=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value>     

        </property>     

        <property name="exclusiveConnectionMode">     

            <value>true</value>     

        </property>     

        <property name="connectionPoolSize">     

            <value>3</value>     

        </property>     

        <property name="validatingQuery">     

            <value>SELECT 1</value>     

        </property>     

    </bean>         

      

    <!-- 数据库2 -->  

    <bean id="db2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     

        <property name="uniqueResourceName">     

            <value>mysql/secondary</value>     

        </property>     

        <property name="xaDataSourceClassName">        

            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>     

        </property>  

        <property name="xaDataSourceProperties">     

            <value>URL=jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value>     

        </property>  

        <property name="exclusiveConnectionMode">     

            <value>true</value>     

        </property>  

        <property name="connectionPoolSize">     

            <value>3</value>     

        </property>  

        <property name="validatingQuery">  

            <value>SELECT 1</value>     

        </property>     

    </bean>       

      

    <bean id="userTransactionManager" init-method="init" destroy-method="close"  

        class="com.atomikos.icatch.jta.UserTransactionManager">     

        <property name="forceShutdown" value="true" />     

    </bean>  

      

    <bean id="userTransactionImp" class="com.atomikos.icatch.jta.UserTransactionImp">     

        <property name="transactionTimeout" value="300"/>      

    </bean>  

      

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

        <property name="transactionManager" ref="userTransactionManager" />  

        <property name="userTransaction" ref="userTransactionImp" />  

        <property name="allowCustomIsolationLevels" value="true"/>   

    </bean>  

      

    <!-- 配置事务传播特性 -->  

    <tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">  

        <tx:attributes>  

           <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>  

           <tx:method name="*" read-only="true"/>  

       </tx:attributes>  

    </tx:advice>  

      

    <!-- 事务管理 -->  

    <aop:config proxy-target-class="true">  

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

    </aop:config>  

      

    <bean id="userDao" class="com.zdp.dao.UserDao">  

        <property name="dataSource" ref="db1" />  

    </bean>  

      

    <bean id="logDao" class="com.zdp.dao.LogDao">  

        <property name="dataSource" ref="db2" />  

    </bean>  

      

    <bean id="userService" class="com.zdp.service.UserService">  

        <property name="userDao" ref="userDao" />  

        <property name="logDao" ref="logDao" />              

    </bean>  

</beans>    

其他的代码请参见上一篇博客。

源码下载: http://download.csdn.NET/detail/zdp072/7950391
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: