• spring+atomikos 实现的分布式事务


    spring +JTA + atomikos 实现分布式事务
    ***1 同一个web服务器,多个数据库,使用atomikos
    2 跨越多个web服务器的事务,如果远程调用支持事务传播,使用JTA,如果不支持事务传播,尽量转化为一个web服务器的情况*
    参考的网上一篇文章
    配置了2个数据源,在一个service方法中同时向2个数据库中的表分别插入数据。
    1、准备数据

    create database user;
    CREATE TABLE `user` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    create database log;
    CREATE TABLE `log` (
      `id` int(11) DEFAULT NULL,
      `content` varchar(5) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ApplicationContext.xml配置文件中的内容:

    <?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="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&amp;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&amp;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>  

    配置文件中的SimpleDataSourceBean类的介绍:
    http://blog.csdn.net/guchuanlong/article/details/12600337

    2 下载附件中的内容,下载地址:http://download.csdn.net/download/zdp072/7950391
    导入eclipse中,运行UserTest类中的testSave()方法,成功后2个表中都插入了数据。
    模拟异常情况,因为log表的content字段长度是5,如果插入的数据长度超过5,就会异常,模拟一下这种情况,当发生异常时,2个表中都不会插入数据,即事务要么全部成功,要么全部不成功,测试通过,你自己可以试试。(备注:这个例子是网上找的,感谢这个同学)

  • 相关阅读:
    Eclipse 重构功能的使用与重构快捷键
    Idea工具常用技巧总结
    Eclipse常用快捷键
    RabbitMQ的原理和使用
    总结消息队列RabbitMQ的基本用法
    rabbitmq常见运维命令和问题总结
    关于RabbitMQ关键性问题的总结
    Rabbit MQ 面试题相关
    RabbitMQ的使用总结
    史玉柱: 我的成功不是偶然(底下还有一堆相关链接)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13310641.html
Copyright © 2020-2023  润新知