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

spring分布式事务

    博客分类:
  • JAVA
 
阅读更多

分布式事务是指操作多个数据库之间的事务,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及实现

Java代码  收藏代码
  1. public   interface  GenericDao {  
  2.   
  3.     public   int  save(String ds, String sql, Object[] obj)  throws  Exception;  
  4.       
  5.     public   int  findRowCount(String ds, String sql);  
  6.       
  7. }  

 

Java代码  收藏代码
  1. public   class  GenericDaoImpl  implements  GenericDao{  
  2.   
  3.     private   JdbcTemplate jdbcTemplateA;  
  4.     private   JdbcTemplate jdbcTemplateB;  
  5.   
  6.     public   void  setJdbcTemplateA(JdbcTemplate jdbcTemplate) {  
  7.         this .jdbcTemplateA = jdbcTemplate;  
  8.     }  
  9.   
  10.     public   void  setJdbcTemplateB(JdbcTemplate jdbcTemplate) {  
  11.         this .jdbcTemplateB = jdbcTemplate;  
  12.     }  
  13.       
  14.     public   int  save(String ds, String sql, Object[] obj)  throws  Exception{  
  15.         if ( null  == ds ||  "" .equals(ds))  return  - 1 ;  
  16.         try {  
  17.             if (ds.equals( "A" )){  
  18.                 return   this .jdbcTemplateA.update(sql, obj);  
  19.             }else {  
  20.                 return   this .jdbcTemplateB.update(sql, obj);  
  21.             }  
  22.         }catch (Exception e){  
  23.             e.printStackTrace();  
  24.             throw   new  Exception( "执行"  + ds +  "数据库时失败!" );  
  25.         }  
  26.     }  
  27.   
  28.     public   int  findRowCount(String ds, String sql) {  
  29.         if ( null  == ds ||  "" .equals(ds))  return  - 1 ;  
  30.           
  31.         if (ds.equals( "A" )){  
  32.             return   this .jdbcTemplateA.queryForInt(sql);  
  33.         }else {  
  34.             return   this .jdbcTemplateB.queryForInt(sql);  
  35.         }  
  36.     }  
  37.   
  38. }  


(2)、Service及实现

Java代码  收藏代码
  1. public   interface  UserService {  
  2.       
  3.     public   void  saveUser()  throws  Exception;  
  4.       
  5. }  

 

Java代码  收藏代码
  1. public   class  UserServiceImpl  implements  UserService{  
  2.   
  3.     private  GenericDao genericDao;  
  4.       
  5.     public   void  setGenericDao(GenericDao genericDao) {  
  6.         this .genericDao = genericDao;  
  7.     }  
  8.   
  9.     public   void  saveUser()  throws  Exception {  
  10.         String userName = "user_"  + Math.round(Math.random()* 10000 );  
  11.         System.out.println(userName);  
  12.           
  13.         StringBuilder sql = new  StringBuilder();  
  14.         sql.append(" insert into t_user(username, gender) values(?,?); " );  
  15.         Object[] objs = new  Object[]{userName, "1" };  
  16.           
  17.         genericDao.save("A" , sql.toString(), objs);  
  18.           
  19.         sql.delete(0 , sql.length());  
  20.         sql.append(" insert into t_user(name, sex) values(?,?); " );  
  21.         objs = new  Object[]{userName, "男的" }; //值超出范围   
  22.         genericDao.save("B" , sql.toString(), objs);  
  23.     }  
  24.   
  25. }  


(3)、applicationContext-jotm.xml

Xml代码  收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2.   
  3. < beans   xmlns = "http://www.springframework.org/schema/beans"    
  4.     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"    
  5.     xmlns:context = "http://www.springframework.org/schema/context"    
  6.     xmlns:aop = "http://www.springframework.org/schema/aop"    
  7.     xmlns:tx = "http://www.springframework.org/schema/tx"    
  8.     xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  9.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  10.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd   
  11.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
  12.   
  13.     < description > springJTA </ description >   
  14.   
  15.     <!--指定Spring配置中用到的属性文件-->    
  16.     < bean   id = "propertyConfig"    
  17.             class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >    
  18.         < property   name = "locations" >    
  19.             < list >    
  20.                 < value > classpath:jdbc.properties </ value >    
  21.             </ list >    
  22.         </ property >    
  23.     </ bean >    
  24.       
  25.     <!-- JOTM实例 -->   
  26.     < bean   id = "jotm"   class = "org.springframework.transaction.jta.JotmFactoryBean" >   
  27.           < property   name = "defaultTimeout"   value = "500000" />   
  28.     </ bean >   
  29.   
  30.     <!-- JTA事务管理器 -->   
  31.     < bean   id = "jtaTransactionManager"   class = "org.springframework.transaction.jta.JtaTransactionManager" >      
  32.         < property   name = "userTransaction"   ref = "jotm"   />      
  33.     </ bean >   
  34.   
  35.     <!-- 数据源A -->    
  36.     < bean   id = "dataSourceA"   class = "org.enhydra.jdbc.pool.StandardXAPoolDataSource"   destroy-method = "shutdown" >    
  37.        < property   name = "dataSource" >    
  38.            < bean   class = "org.enhydra.jdbc.standard.StandardXADataSource"   destroy-method = "shutdown" >    
  39.                < property   name = "transactionManager"   ref = "jotm" />    
  40.                < property   name = "driverName"   value = "${jdbc.driver}" />    
  41.                < property   name = "url"   value = "${jdbc.url}" />    
  42.            </ bean >    
  43.        </ property >    
  44.        < property   name = "user"   value = "${jdbc.username}" />    
  45.        < property   name = "password"   value = "${jdbc.password}" />    
  46.     </ bean >    
  47.   
  48.     <!-- 数据源B -->    
  49.     < bean   id = "dataSourceB"   class = "org.enhydra.jdbc.pool.StandardXAPoolDataSource"   destroy-method = "shutdown" >    
  50.        < property   name = "dataSource" >    
  51.            < bean   class = "org.enhydra.jdbc.standard.StandardXADataSource"   destroy-method = "shutdown" >    
  52.                < property   name = "transactionManager"   ref = "jotm" />    
  53.                < property   name = "driverName"   value = "${jdbc2.driver}" />    
  54.                < property   name = "url"   value = "${jdbc2.url}" />    
  55.            </ bean >    
  56.        </ property >    
  57.        < property   name = "user"   value = "${jdbc2.username}" />    
  58.        < property   name = "password"   value = "${jdbc2.password}" />    
  59.     </ bean >    
  60.   
  61.     < bean   id  =  "jdbcTemplateA"    
  62.          class  =  "org.springframework.jdbc.core.JdbcTemplate" >    
  63.          < property   name  =  "dataSource"   ref = "dataSourceA" />    
  64.     </ bean >   
  65.       
  66.     < bean   id  =  "jdbcTemplateB"    
  67.          class  =  "org.springframework.jdbc.core.JdbcTemplate" >    
  68.          < property   name  =  "dataSource"   ref = "dataSourceB" />    
  69.     </ bean >       
  70.   
  71.     <!-- 事务切面配置 -->    
  72.     < aop:config >    
  73.         < aop:pointcut   id = "pointCut"   
  74.                 expression = "execution(* com.logcd.service..*.*(..))" /> <!-- 包及其子包下的所有方法 -->   
  75.         < aop:advisor   pointcut-ref = "pointCut"   advice-ref = "txAdvice" />    
  76.           
  77.         < aop:advisor   pointcut = "execution(* *..common.service..*.*(..))"   advice-ref = "txAdvice" />   
  78.     </ aop:config >    
  79.   
  80.     <!-- 通知配置 -->    
  81.     < tx:advice   id = "txAdvice"   transaction-manager = "jtaTransactionManager" >    
  82.        < tx:attributes >    
  83.           < tx:method   name = "delete*"   rollback-for = "Exception" />    
  84.           < tx:method   name = "save*"   rollback-for = "Exception" />    
  85.           < tx:method   name = "update*"   rollback-for = "Exception" />    
  86.           < tx:method   name = "find*"   read-only = "true"   rollback-for = "Exception" />    
  87.        </ tx:attributes >    
  88.     </ tx:advice >    
  89.   
  90.     < bean   id = "genericDao"    
  91.             class = "com.logcd.dao.impl.GenericDaoImpl"   autowire = "byName" >   
  92.     </ bean >   
  93.   
  94.     < bean   id = "userService"    
  95.             class = "com.logcd.service.impl.UserServiceImpl"   autowire = "byName" >   
  96.     </ bean >   
  97.   
  98. </ beans >   


(4)、测试

Java代码  收藏代码
  1. public   class  TestUserService{  
  2.   
  3.     private   static  UserService userService;  
  4.       
  5.     @BeforeClass   
  6.     public   static   void  init(){  
  7.         ApplicationContext app = new  ClassPathXmlApplicationContext( "applicationContext-jotm.xml" );  
  8.         userService = (UserService)app.getBean("userService" );  
  9.     }  
  10.       
  11.     @Test   
  12.     public   void  save(){  
  13.         System.out.println("begin..." );  
  14.         try {  
  15.             userService.saveUser();  
  16.         }catch (Exception e){  
  17.             System.out.println(e.getMessage());  
  18.         }  
  19.         System.out.println("finish..." );  
  20.     }  
  21.       
  22. }  


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

Xml代码  收藏代码
  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代码  收藏代码
  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 >   
分享到:
评论

相关推荐

    Spring分布式事务实现

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

    spring分布式事务配置详解附源码

    spring分布式配置详解,并有testng测试报告, 公司封了端口,下载后,把后缀名改为rar就行了

    spring分布式事务提交atomikos 相关jar与示例

    Spring 分布式事务管理是大型企业级应用中不可或缺的一部分,它允许在多个数据库或服务之间进行一致性的数据操作。Atomikos 是一个开源的事务管理器,特别适用于 Spring 应用,提供了强大的分布式事务处理能力。这篇...

    Spring+JOTM 分布式事务管理

    Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM(Java Open Transaction Manager)来处理分布式事务。本文将深入探讨Spring与JOTM结合使用的知识点,帮助...

    分布式事务实践 解决数据一致性

    6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-DB.链式事务管理器 6-6 实例2-JPA-DB.链式事务管理器 6-7 实例3-JMS-DB.最大努力一次提交 6-8 分布式事务实现模式与技术 6-9 全局一致性ID和...

    java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip

    本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...

    java分布式事务demo

    在Java中,实现分布式事务的方法有很多,例如使用JTA(Java Transaction API)或者Spring框架的声明式事务管理。 1. **JTA(Java Transaction API)**:这是Java平台的标准API,用于管理全局事务,可以跨越多个资源...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    spring2.5+hibernatet 搞定分布式事务

    spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务

    springboot多数据源即分布式事务解决方案

    SpringBoot提供了多种分布式事务管理器,如JTA(Java Transaction API)和Spring的PlatformTransactionManager。 JTA是Java EE平台的标准,支持全局事务。在SpringBoot中,可以使用Atomikos或Bitronix这样的第三方...

    springcloud整合分布式事务框架TX-LCN

    本文将深入探讨如何在Spring Cloud环境中整合分布式事务框架TX-LCN,以实现高效、一致的数据操作。 TX-LCN(Transaction for LCN)是一个轻量级的分布式事务解决方案,它为Java开发者提供了一种简单易用的方式来...

    spring整合atomikos实现分布式事务的方法示例

    Spring 整合 Atomikos 实现分布式事务是解决在分布式环境下多个数据库操作一致性问题的关键技术。Atomikos 是一个开源的事务管理器,它为 Java 平台提供了强大的支持,特别是处理跨越多个数据库的事务需求。在分布式...

    第二部分spring+hibernate+jta 分布式事务Demo

    Spring、Hibernate和JTA(Java Transaction API)是Java开发者在构建分布式事务解决方案时常用的三大技术。本示例“第二部分spring+hibernate+jta 分布式事务Demo”将帮助我们理解如何在这三个框架之间协同工作,...

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

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

    spring分布式架构学习PPT

    分布式事务是Spring分布式架构中的一个重要概念,即多个微服务之间的交互可以作为一个事务来处理。分布式事务可以确保多个微服务之间的数据一致性和事务一致性。 CAP定理是Spring分布式架构中的一个重要概念,即在...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    本教程将深入探讨如何在Spring Boot环境下实现多数据源操作及分布式事务管理,并加入对多线程的支持。 首先,我们来理解多数据源的概念。在大型系统中,往往需要连接多个数据库,如主库、从库、测试库等。Spring ...

    Spring2.5+hibernate搞定分布式事务

    Spring2.5+hibernate搞定分布式事务Spring2.5+hibernate搞定分Spring2.5+hibernate搞定分布式事务布式事务 第三部分

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    spring 结合druid和hibernate使用jta配置分布式事务

    Spring框架提供了强大的事务管理功能,而分布式事务则是处理多数据库操作时的关键技术。本篇将详细讲解如何在Spring环境中结合Druid数据源和Hibernate ORM框架,利用Atomikos实现JTA(Java Transaction API)来配置...

Global site tag (gtag.js) - Google Analytics