- 浏览: 1089101 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
skyesx:
这是2PC实现,更常用的是一个柔性事务的实现,可以参考http ...
Spring分布式事务实现 -
ddbird:
这第一句就不严谨“分布式事务是指操作多个数据库之间的事务”,显 ...
Spring分布式事务实现 -
呵呵6666:
基于互联网支付系统的微服务架构分布式事务解决方案http:// ...
Spring分布式事务实现 -
小黄牛:
写得不错,交流群:472213887
Spring分布式事务实现 -
jiaoqf321456:
这明明是用的apache的压缩,给ant.jar有半毛钱关系吗 ...
使用ant.jar进行文件zip压缩
分布式事务是指操作多个数据库之间的事务,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及实现
(2)、Service及实现
(3)、applicationContext-jotm.xml
(4)、测试
二、关于使用atomikos实现
(1)、数据源配置
(2)、事务配置
在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
<?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:context="http://www.springframework.org/schema/context" 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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <description>springJTA</description> <!--指定Spring配置中用到的属性文件--> <bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- JOTM实例 --> <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"> <property name="defaultTimeout" value="500000"/> </bean> <!-- JTA事务管理器 --> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction" ref="jotm" /> </bean> <!-- 数据源A --> <bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> </property> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 数据源B --> <bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc2.driver}"/> <property name="url" value="${jdbc2.url}"/> </bean> </property> <property name="user" value="${jdbc2.username}"/> <property name="password" value="${jdbc2.password}"/> </bean> <bean id = "jdbcTemplateA" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="dataSourceA"/> </bean> <bean id = "jdbcTemplateB" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="dataSourceB"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="pointCut" expression="execution(* com.logcd.service..*.*(..))"/><!-- 包及其子包下的所有方法 --> <aop:advisor pointcut-ref="pointCut" advice-ref="txAdvice"/> <aop:advisor pointcut="execution(* *..common.service..*.*(..))" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="jtaTransactionManager"> <tx:attributes> <tx:method name="delete*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="find*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice> <bean id="genericDao" class="com.logcd.dao.impl.GenericDaoImpl" autowire="byName"> </bean> <bean id="userService" class="com.logcd.service.impl.UserServiceImpl" autowire="byName"> </bean> </beans>
(4)、测试
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)、数据源配置
<bean id="dataSourceA" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>${datasource.uniqueResourceName}</value> </property> <property name="xaDataSourceClassName"> <value>${database.driver_class}</value> </property> <property name="xaDataSourceProperties"> <value>URL=${database.url};user=${database.username};password=${database.password}</value> </property> <property name="exclusiveConnectionMode"> <value>${connection.exclusive.mode}</value> </property> <property name="connectionPoolSize"> <value>${connection.pool.size}</value> </property> <property name="connectionTimeout"> <value>${connection.timeout}</value> </property> <property name="validatingQuery"> <value>SELECT 1</value> </property> </bean>
(2)、事务配置
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true"/> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="${transaction.timeout}"/> </bean> <!-- JTA事务管理器 --> <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..service*..*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="springTransactionManager"> <tx:attributes> <tx:method name="*" rollback-for="Exception"/> </tx:attributes> </tx:advice>
- lib.rar (5.2 MB)
- 描述: JOTM使用包
- 下载次数: 1082
评论
9 楼
skyesx
2017-04-07
这是2PC实现,更常用的是一个柔性事务的实现,可以参考
https://github.com/QNJR-GROUP/EasyTransaction
https://github.com/QNJR-GROUP/EasyTransaction
8 楼
ddbird
2017-03-13
这第一句就不严谨“分布式事务是指操作多个数据库之间的事务”,显然未必一定是数据库。
7 楼
呵呵6666
2016-10-11
基于互联网支付系统的微服务架构分布式事务解决方案
http://www.roncoo.com/article/detail/124243
http://www.roncoo.com/article/detail/124243
6 楼
小黄牛
2016-08-02
写得不错,交流群:472213887
5 楼
zhanghq0717
2015-03-17
mark
4 楼
xuwu168168
2013-11-20
3 楼
edisonlv2010
2012-08-13
感谢分享!
2 楼
roly2000
2011-12-01
1 楼
sscel
2011-11-01
<!-- 数据源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">
根本就没有shutdown这个配置,spring会提示错误,我用的是你的lib下的jar包也是一样,同时我是用spring_hibernate整合来实现分布式事务的,为什么会报Caused by: org.hibernate.TransactionException: Could not find UserTransaction in JNDI [java:comp/UserTransaction]。希望你能帮我解决下我的问题,先跟你说声thankyou!
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">
根本就没有shutdown这个配置,spring会提示错误,我用的是你的lib下的jar包也是一样,同时我是用spring_hibernate整合来实现分布式事务的,为什么会报Caused by: org.hibernate.TransactionException: Could not find UserTransaction in JNDI [java:comp/UserTransaction]。希望你能帮我解决下我的问题,先跟你说声thankyou!
发表评论
-
SpringBoot开发WebService之Axis
2019-07-14 23:56 4626一、服务器端发布WebService服务 1、POM.xml文 ... -
SpringBoot开发WebService之CXF
2019-07-14 23:56 1210一、在服务器端的WebSerivce服务发布 1、POM.xm ... -
SpringBoot项目非web方式启动
2019-07-03 17:02 46881、springboot 1.x中以非web方式启动 @S ... -
SpringBoot使用Druid数据库密码加密
2019-03-06 23:28 14341、生成公钥、私钥和密码加密串 java -cp drui ... -
Spring Annotation
2010-12-02 17:14 0Spring2.x引入了组件自动扫描机制,可以在类路径底 ... -
Spring3 Annotation + Hibernate3-jpa2.0 + CGLIB + 多数据源
2010-08-19 09:30 10481一、定义一个测试用Entity。 @Entity pub ... -
使用iBatis2.0
2010-05-26 10:20 0一、NULL问题 ibatis操作oracle数据库时, ... -
使用AspectJ LTW(Load Time Weaving)
2010-01-04 14:25 10721在Java 语言中,从 ... -
Spring2.0 AOP AspectJ 注释实现
2010-01-04 14:24 5540一、AOP基本概念 切面(Aspect): 一个关注点的模块 ... -
Spring + JPA + Hibernate配置
2010-01-04 14:24 34696<1>persistence.xml放到类路径下的 ... -
配置spring数据源
2009-11-06 16:47 1215配置一个数据源 Spring在第三方依赖包中包含了两 ... -
hibernate的dialect
2009-07-23 10:04 5407一、hibernate的dialect RDBM ... -
spring ibatis入门
2009-04-20 14:16 3842一、applicationContext.xml <?x ... -
Hibernate缓存配置/批量处理
2009-03-25 21:50 10910Hibernate除了自动对Se ... -
Hibernate的一级与二级缓存
2009-03-25 21:24 1675缓存是介于应用程序和物理数据源之间,其作用是为了降低应用 ... -
spring jdbcTemplate使用
2008-07-15 17:17 78163一、使用示例 (1)springJdbcContext.xml ... -
Spring2.X以AspectJ 式AOP 配置事务
2008-07-10 13:23 2035(1)配置: Spring的事务管理是通过AOP代理实 ... -
spring 事务管理
2008-07-08 16:35 11923声明式的事务管理(Declarative transactio ... -
Hibernate中one-to-many/many-to-one和many-to-many
2008-06-28 17:03 3937<1>one-to-many/many-to-on ... -
Hibernate中的对象one-to-one关系
2008-06-26 22:55 2446(1) 通过主健参考,限制2个数据表中的主健使用相同的值 c ...
相关推荐
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和...
简单易懂的JOTM实现分布式事务控制,此代码是maven项目,如果需要jar可以邮件给我,我发给你。
spring + JTA + JOTM实现分布式事务, 高大上的技术
spring事务以及分布式事务实现.zip one-data-source 单数据源事务 two-data-source 多数据源事务 模块包括 多数据源配置方法 使用atomikos管理多数据源事务 多数据源事务结合Druid数据库连接池 代码包括声明式事务和...
基于若依项目改造的多模块分布式事务,使用了atomikos进行分布式事务的管理。
Spring2.5实现事务管理(本地事务、分布式事务).doc
Spring Boot+Druid+Mybatis实现JTA分布式事务
实现系统对多数据源的操作。 实现系统对多数据源的分布式事务管理,包括事务的提交和回滚。
实现系统对多数据源的操作。 实现系统对多数据源的分布式事务管理,包括事务的提交和回滚。
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
使用KafkaStreams和SpringBoot实现微服务Saga分布式事务-Piotr.pdf使用KafkaStreams和SpringBoot实现微服务Saga分布式事务-Piotr.pdf使用KafkaStreams和SpringBoot实现微服务Saga分布式事务-Piotr.pdf使用Kafka...
NULL 博文链接:https://tws502934462.iteye.com/blog/1186912
spring+hibernate+atomikos实现多数据源分布式事务管理
代码下载下来,想要了解更多相关内容可以看http://www.cnblogs.com/shamo89/p/7307961.html
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA) 结合spring 和durid进行配置,
教程中的样例项目基于龙果学院开源的微支付系统进行实现,使用Dubbo作为服务化框架,教程中所实现的分布式事务解决方案在Java体系中的微服务架构系统都能通用,与具体的开发框架无关。 教程样例项目中用到的技术及...
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
基于微服务架构的分布式系统应用越来越多,而分布式系统下的事务,一直没有一个简单统一的实现方案。本课程从本地事务出发,介绍了...课程中还提供了大量的实例,让同学们在实战过程中,掌握分布式事务实现方式与思路。
spring + JTA + atomikos实现分布式事务, 高大上的技术