Spring分布式事务实现

分布式事务是指操作多个数据库之间的事务,spring的org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持。如果使用WAS的JTA支持,把它的属性改为WebSphere对应的TransactionManager。 
    在tomcat下,是没有分布式事务的,不过可以借助于第三方软件jotm(Java Open Transaction Manager )和AtomikosTransactionsEssentials实现,在spring中分布式事务是通过jta(jotm,atomikos)来进行实现。 
1、http://jotm.objectweb.org/ 
2、http://www.atomikos.com/Main/TransactionsEssentials 

一、使用JOTM例子 
(1)、Dao及实现 

public interface GenericDao {  
  
    public int save(String ds, String sql, Object[] obj) throws Exception;  
      
    public int findRowCount(String ds, String sql);  
      
}  
public class GenericDaoImpl implements GenericDao{  
  
    private  JdbcTemplate jdbcTemplateA;  
    private  JdbcTemplate jdbcTemplateB;  
  
    public void setJdbcTemplateA(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplateA = jdbcTemplate;  
    }  
  
    public void setJdbcTemplateB(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplateB = jdbcTemplate;  
    }  
      
    public int save(String ds, String sql, Object[] obj) throws Exception{  
        if(null == ds || "".equals(ds)) return -1;  
        try{  
            if(ds.equals("A")){  
                return this.jdbcTemplateA.update(sql, obj);  
            }else{  
                return this.jdbcTemplateB.update(sql, obj);  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
            throw new Exception("执行" + ds + "数据库时失败!");  
        }  
    }  
  
    public int findRowCount(String ds, String sql) {  
        if(null == ds || "".equals(ds)) return -1;  
          
        if(ds.equals("A")){  
            return this.jdbcTemplateA.queryForInt(sql);  
        }else{  
            return this.jdbcTemplateB.queryForInt(sql);  
        }  
    }  
  
}  


(2)、Service及实现 

public interface UserService {  
      
    public void saveUser() throws Exception;  
      
}  
public class UserServiceImpl implements UserService{  
  
    private GenericDao genericDao;  
      
    public void setGenericDao(GenericDao genericDao) {  
        this.genericDao = genericDao;  
    }  
  
    public void saveUser() throws Exception {  
        String userName = "user_" + Math.round(Math.random()*10000);  
        System.out.println(userName);  
          
        StringBuilder sql = new StringBuilder();  
        sql.append(" insert into t_user(username, gender) values(?,?); ");  
        Object[] objs = new Object[]{userName,"1"};  
          
        genericDao.save("A", sql.toString(), objs);  
          
        sql.delete(0, sql.length());  
        sql.append(" insert into t_user(name, sex) values(?,?); ");  
        objs = new Object[]{userName,"男的"};//值超出范围  
        genericDao.save("B", sql.toString(), objs);  
    }  
  
}  


(3)、applicationContext-jotm.xml 

public class TestUserService{  
  
    private static UserService userService;  
      
    @BeforeClass  
    public static void init(){  
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext-jotm.xml");  
        userService = (UserService)app.getBean("userService");  
    }  
      
    @Test  
    public void save(){  
        System.out.println("begin...");  
        try{  
            userService.saveUser();  
        }catch(Exception e){  
            System.out.println(e.getMessage());  
        }  
        System.out.println("finish...");  
    }  
      
}  


二、关于使用atomikos实现 
(1)、数据源配置 

Xml代码  Spring分布式事务实现
  1. <bean id="dataSourceA" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
  2.     <property name="uniqueResourceName">  
  3.         <value>${datasource.uniqueResourceName}</value>  
  4.     </property>  
  5.     <property name="xaDataSourceClassName">   
  6.         <value>${database.driver_class}</value>   
  7.     </property>   
  8.     <property name="xaDataSourceProperties">  
  9.         <value>URL=${database.url};user=${database.username};password=${database.password}</value>   
  10.     </property>   
  11.     <property name="exclusiveConnectionMode">   
  12.         <value>${connection.exclusive.mode}</value>   
  13.     </property>  
  14.     <property name="connectionPoolSize">   
  15.         <value>${connection.pool.size}</value>  
  16.     </property>  
  17.     <property name="connectionTimeout">  
  18.         <value>${connection.timeout}</value>  
  19.     </property>  
  20.     <property name="validatingQuery">   
  21.         <value>SELECT 1</value>   
  22.     </property>   
  23. </bean>  


(2)、事务配置 

Xml代码  Spring分布式事务实现
  1. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"   
  2.     init-method="init" destroy-method="close">   
  3.     <property name="forceShutdown" value="true"/>   
  4. </bean>   
  5.   
  6. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">   
  7.     <property name="transactionTimeout" value="${transaction.timeout}"/>   
  8. </bean>  
  9.   
  10. <!-- JTA事务管理器 -->   
  11. <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">   
  12.     <property name="transactionManager" ref="atomikosTransactionManager"/>   
  13.     <property name="userTransaction" ref="atomikosUserTransaction"/>   
  14. </bean>  
  15.   
  16. <!-- 事务切面配置 -->   
  17. <aop:config>   
  18.     <aop:pointcut id="serviceOperation"  expression="execution(* *..service*..*(..))"/>   
  19.     <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>   
  20. </aop:config>  
  21.   
  22. <!-- 通知配置 -->  
  23. <tx:advice id="txAdvice" transaction-manager="springTransactionManager">   
  24.     <tx:attributes>  
  25.         <tx:method name="*" rollback-for="Exception"/>   
  26.     </tx:attributes>   
  27. </tx:advice>   

相关推荐