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及实现

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 + Atomikos 分布式事务实现方式 前段时间发现对分布式事务了解的不够清晰,最近又重新看了一下分布式事务,简单做个记录,以后方便查看 Java规范对分布式事务定义了标准的规范Java事务API和Java事务服务,分别是JTA和JTS 一个分布式事务必须包括一个事务管理器和多个资源管理器, 资源管理器是任意类型的持久化数据存储,而事务管理器则是承担着所有事务参与单元者的相互通讯的责任 JTA的规 阅读详情

相关推荐

Java开发运用Spring Cloud实现分布式事务

在当今的软件开发领域,微服务架构已经成为一种主流的架构模式。Spring Cloud作为微服务架构的优秀解决方案,为开发者提供了一系列的工具和组件,帮助他们构建分布式系统。然而,在分布式系统中,事务管理是一个非常复杂的问题。因为在微服务架构中,一个业务操作可能会涉及多个服务的调用,如何保证这些服务的操作要么全部成功,要么全部失败,就需要引入分布式事务的概念。本文的目的就是详细介绍在Java开发中如何运用Spring Cloud来实现分布式事务。

Java大师兄的博客 1026

SpringBoot 分布式系统简单了解

SpringBoot 分布式系统简单了解 SpringBoot 框架的使用基本是了解的差不多了,马上就进入微服务的阶段了,在此之前必须要了解什么是分布式系统。 1. 分布式系统简介 分布式系统(distributed system)是建立在网络之上的软件系统。在《分布式系统原理与范型》书中有分布式系统的定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”。 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普

qq_43560701的博客 6686

实现Java Spring Boot分布式事务

Java Spring Boot是一个流行的框架,它提供了许多工具和功能来简化分布式事务的实现。请注意,以上只是一个简单的示例,实际的分布式事务实现可能涉及更复杂的业务逻辑和多个参与者。但是,通过上述步骤和Seata的支持,您可以在Spring Boot项目中构建更可靠和强大的分布式系统。这样配置后,Seata将能够拦截到所有的数据库操作,并根据事务的提交或回滚状态来执行相应的操作。方法标记为全局事务,当该方法被调用时,Seata会自动管理整个事务的执行和回滚。是两个需要参与分布式事务的方法。

UtdPatch的博客 192

spring分布式开发框架

spring分布式开发框架 分布式开发就是将spring项目的dao层,service层,controller层以及entity层分别建立在不同的项目下。 步骤 新建一个maven项目,不使用模板,取名为project1_parent项目,作为所有项目的父类 接下来新建一个project1_controller项目,作为controller层,与spring 进行交互,应用maven模板,然后按...

kwai_lm的博客 6732

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1579

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 472

Spring分布式事务- 三种实现方式(Spring+JTA)

分布式事务是指事务的参与者、支持事务的服务器、资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算机资源上访问并且更新数据,将两个或多个网络计算机的数据进行的多次操作作为一个整体进行处理。如不同银行账户之间的转账。对于在项目中接触到JTA,大部分的原因是因为在项目中需要操作多个数据库,同时,可以保证操作的原子性,保证对多个数据库的操作一致性。 项目结构图

Roden的专栏 3万+

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

【Spring专题】,三分钟搞定分布式结构服务部署发布

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!刷刷题,为金九银十冲一波!

2401_84103216的博客 1027

将Python爬取的数据导入钉钉多维表

摘要:本文介绍将Python爬取的数据导入钉钉多维表的完整解决方案。首先通过requests库爬取数据并解析为结构化格式,然后使用钉钉开放平台API对接多维表。关键步骤包括获取app_key、app_secret等凭证,通过OAuth2获取access_token,以及批量写入记录。文章详细说明了参数获取位置、字段类型匹配、权限配置等注意事项,并提供了错误处理建议和性能优化方法。适用于需要将网络数据同步到钉钉多维表的开发场景。

IT深耕十余载,大道之简 2130

【经验分享】使用Keil5烧录代码遇到的问题及解决方法

本文介绍了在使用Keil5烧录代码过程中可能遇到的常见问题,主要为编译错误和下载失败,并提供了解决方案和注意事项。通过本文中提供的具体解决方案和注意事项,希望能够帮助读者更加顺利地进行Keil5烧录代码操作,提高开发效率和成果实现。

qq_63195670的博客 1万+

spring 7 种分布式事务实现

翻译自 http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1   在Spring中常常使用JTA以及XA协议来实现分布式事务,不过我们也有其他选项。最佳实现取决于你的应用场景,比如使用什么类型的资源,如何在性能、安全、可靠性和数据完整性之间权衡。在这个系列文章中,来自Spring...

blue2048 2190

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究

在现代社会,电力一直扮演着最重要的角色之一。它不仅与人民的生活息息相关,更是一个国家发展的命脉。近年来,随着我国各特高压输电线路建成(比如2022年1月份白鹤滩江苏特高压输电线路的放线)以及电网规模的不断扩大,我国年发电量稳步上升,人民的生活水平越来越高。我国土地辽阔,输电线路分布广泛,再加上地形环境复杂多样,电力线可能遭受风吹雨晒甚至是冰雪寒灾的影响。因此,为了保障电力线的可靠供电,防止停电意外发生,电力部门要定期对输电线路进行检查。目前我国主要。

getusushu的博客 1010

使用Spring Boot实现分布式事务

使用Spring Boot实现分布式事务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,分布式事务是一个重要的概念,它用于确保在分布式系统中各个服务之间的数据一致性。分布式事务的实现相对复杂,因为它需要跨越多个服务、数据库或消息队列来维护数据的一致性。本文将详细介绍如何使用Sp...

weixin_37063104的博客 158

DDR5中的On-Die Termination(ODT)详解:电阻值支持及其背后的秘密

DDR5支持多档ODT电阻值,范围从40Ω到480Ω,均基于240Ω标准参考电阻RZQR_{ZQ}RZQ​。不同电阻档位对应不同的信号负载和功耗需求。校准电压点关键,常用0.8×VDD进行精准调校。CA信号间ODT匹配必须严格控制,保证命令总线稳定。选择合适的ODT值是高速内存设计中不可忽视的细节。

weixin_43199439的博客 2095

【UG\NX二次开发】多个带ui的dll怎么整合到一个dll

NX二次开发-群精选」专栏收录了那些曾散落在聊天对话框里的精彩的知识分享,这都是被遗落的宝贵财富。让我们一起向大佬学习,充满激情地进步,不断超越自己。底部联系方式,欢迎您加入一起交流。有大佬知道多个带ui的dll怎么整合到一个dll吗。

王牌飞行员_里海的博客 283
上一篇: spring+hibernate+jta 分布式事务Demo
下一篇: 在Spring中使用JTA事务管理
action5362603
博客等级 码龄18年 6粉丝 396原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值