JTA分布式事务实战

spring3.0    分布式事务  jta  atomikos

1.使用如下jar包

atomikos-util.3.7.0.jar

cglib-nodep-2.2.2.jar

transactions-3.7.0.jar

transactions-api-3.7.0.jar

transactions-jdbc-3.7.0.jar

transactions-jta-3.7.0.jar

2.spring配置文件如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
  6. default-lazy-init="true">
  7. <context:component-scan base-package="com.atom.jta.test" />
  8. <!-- atomikos事务管理器 -->
  9. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
  10. init-method="init" destroy-method="close">
  11. <description>UserTransactionManager</description>
  12. <property name="forceShutdown">
  13. <value>true</value>
  14. </property>
  15. </bean>
  16. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  17. <property name="transactionTimeout" value="300" />
  18. </bean>
  19. <!-- spring 事务管理器 -->
  20. <bean id="springTransactionManager"
  21. class="org.springframework.transaction.jta.JtaTransactionManager">
  22. <property name="transactionManager">
  23. <ref bean="atomikosTransactionManager" />
  24. </property>
  25. <property name="userTransaction">
  26. <ref bean="atomikosUserTransaction" />
  27. </property>
  28. <property name="allowCustomIsolationLevels" value="true">
  29. </property>
  30. </bean>
  31. <!-- 事务拦截器 -->
  32. <bean id="transactionInterceptor"
  33. class="org.springframework.transaction.interceptor.TransactionInterceptor">
  34. <!-- 配置事务管理器 -->
  35. <property name="transactionManager" ref="springTransactionManager" />
  36. <!-- 方法名:要求的事务属性 -->
  37. <property name="transactionAttributes">
  38. <props>
  39. <prop key="insertTest">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ,-Throwable
  40. </prop>
  41. </props>
  42. </property>
  43. </bean>
  44. <bean
  45. class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  46. <property name="beanNames">
  47. <list>
  48. <value>atomTransactionServiceImpl</value>
  49. </list>
  50. </property>
  51. <property name="interceptorNames">
  52. <list>
  53. <value>transactionInterceptor</value>
  54. </list>
  55. </property>
  56. </bean>
  57. </beans>

2.数据源:

datasource1:

Java代码  

  1. package com.atom.jta.test;
  2. import java.util.Properties;
  3. import org.springframework.stereotype.Repository;
  4. import com.atomikos.jdbc.AtomikosDataSourceBean;
  5. @Repository
  6. public class MasterAtomDatasource extends AtomikosDataSourceBean {
  7. private static final long serialVersionUID = -2471230875536339311L;
  8. public MasterAtomDatasource(){
  9. Properties prop = new Properties();
  10. prop.put("user", "root");
  11. prop.put("password", "");
  12. prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true");
  13. setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
  14. setUniqueResourceName("mysql_ds1");
  15. setPoolSize(5);
  16. setXaProperties(prop);
  17. }
  18. }

datasource2:

Java代码  

  1. package com.atom.jta.test;
  2. import java.util.Properties;
  3. import org.springframework.stereotype.Repository;
  4. import com.atomikos.jdbc.AtomikosDataSourceBean;
  5. @Repository
  6. public class SlaveAtomDataSource extends AtomikosDataSourceBean {
  7. private static final long serialVersionUID = -6210394799199416765L;
  8. public SlaveAtomDataSource(){
  9. Properties prop = new Properties();
  10. prop.put("user", "root");
  11. prop.put("password", "");
  12. prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test1?autoReconnect=true");
  13. setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
  14. setUniqueResourceName("mysql_ds2");
  15. setPoolSize(5);
  16. setXaProperties(prop);
  17. }
  18. }

3.BaseDao:

Java代码  

  1. package com.atom.jta.test;
  2. import javax.annotation.Resource;
  3. import javax.sql.DataSource;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. import org.springframework.stereotype.Repository;
  6. @Repository
  7. public class AtomBaseDao {
  8. private JdbcTemplate mastTemplate;
  9. private JdbcTemplate slaveTemplate;
  10. public JdbcTemplate getMastTemplate() {
  11. return mastTemplate;
  12. }
  13. @Resource(name="masterAtomDatasource")
  14. public void setMastTemplate(DataSource source) {
  15. this.mastTemplate = new JdbcTemplate(source);
  16. }
  17. public JdbcTemplate getSlaveTemplate() {
  18. return slaveTemplate;
  19. }
  20. @Resource(name="slaveAtomDataSource")
  21. public void setSlaveTemplate(DataSource source) {
  22. this.slaveTemplate = new JdbcTemplate(source);
  23. }
  24. }

4.测试service

Java代码  

  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. public interface AtomTransactionService {
  4. public void insertTest(ApplicationContext ctx) throws Exception;
  5. }

Java代码  

  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class AtomTransactionServiceImpl implements AtomTransactionService {
  6. public void insertTest(ApplicationContext ctx) throws Exception {
  7. AtomBaseDao baseDao = ctx.getBean(AtomBaseDao.class);
  8. String str = "xxxx";
  9. String masterSql = "insert into demo (name) values "+"(‘"+str+"‘)";
  10. String slaveSql = "insert into test (name) values "+"(‘"+str+"‘)";
  11. baseDao.getMastTemplate().execute(masterSql);
  12. baseDao.getSlaveTemplate().execute(slaveSql);
  13. throw new Exception();
  14. }
  15. }

5.事务测试

Java代码  

  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class AtomTest {
  5. public AtomTest(){
  6. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-atomikos.xml");
  7. AtomTransactionService service = ctx.getBean(AtomTransactionService.class);
  8. try {
  9. service.insertTest(ctx);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. AtomTest test = new AtomTest();
  16. System.out.println("done.....");
  17. }
  18. }
时间: 2024-11-10 07:20:38

JTA分布式事务实战的相关文章

springCloud分布式事务实战(六)编写第二个微服务

(1)创建工程 (2)添加 jar pom.xml添加:springboot 父, mysql连接,(mybatis, spring-mybatis springboot ,阿里连接池) ,服务中心客户端. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="

使用Atomikos实现JTA分布式事务

使用Atomikos实现JTA分布式事务 在这篇文章中: 1.1 JTA事务模型 2 JTA规范接口 3 Atomikos分布式事务 本文全面的介绍了JTA分布式事务模型和接口规范,以及开源的分布式事务解决方案Atomikos.笔者认同"talk is cheap,show me the code",因此在文章最后,给出一个完整的Atomikos与spring.mybatis整合的完整案例. 1 JTA规范 Java事务API(JTA:Java Transaction API)和它的同

spring+hibernate+JTA 分布式事务的例子

对于横跨多个Hibernate SessionFacotry的分布式事务,只需简单地将 JtaTransactionManager 同多个 LocalSessionFactoryBean 的定义结合起来作为事务策略.你的每一个DAO通过bean属性得到各自的 SessionFactory 引用.如果所有的底层JDBC数据源都是支持事务的容器,那么只要业务对象使用了 JtaTransactionManager 作为事务策略,它就可以横跨多个DAO和多个session factories来划分事务,

JTA 分布式事务

什么是JTA - 2009-07-25 18:31:06|  分类: 技术文章|举报|字号 订阅 什么是JTA?Java Transaction API(Java事务API) (JTA)Java Transaction API(Application Programming Interface)什么是JTA Transaction?它有怎样的特点呢?JTA Transaction是指由J2EE Transaction manager去管理的事务.其最大的特点是调用UserTransaction接

使用Atomikos Transactions Essentials实现多数据源JTA分布式事务--转载

原文:http://www.ite/topic/122700 9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XADatasource支持,如果使用了支持XADatasouce版本,可以参考2楼补充. 最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring+ibatis.因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现

springCloud分布式事务实战(二) 分布式事务处理器的编译和运行之Redis安装

一.分布式事务处理器的编译和运行1)Redis 的安装和启动(1)下载redis 解压缩 (2) 启动和测试redis 1进入redis 目录 2 双击redis-server.exe 程序即可启动 3 启动客户端测试双击redis-cli.exe 输入 原文地址:http://blog.51cto.com/14048134/2310470

springCloud分布式事务实战(四)分布式事务处理器的下载,编译和运行

(1)下载分布式事务处理器工程源码https://github.com/codingapi/tx-lcn/(2)导入eclipse (3)修改配置文件填写分布式事务服务器地址,redis地址 ,注册中心地址#服务端口server.port=7000#tx-manager不得修改spring.application.name=tx-manager spring.mvc.static-path-pattern=/**spring.resources.static-locations=classpat

springCloud分布式事务实战(一)案例需求及实现步骤

本文不对分布式事务原理进行探索,而是通过一个案例来说明如何使用分布式事务 案例需求:创建2个基于springCloud的微服务,分别访问不同的数据库:然后创建一个整合服务,调用微服务实现数据的保存到2个不同的数据库,要求采用分布式事务,要么都成功,要么都失败.案例拓扑图: 实现步骤:1 分布式事务处理器的编译和安装Redis 安装 注册中心编写分布式事务服务器安装 测试2 数据库准备及2个微服务的编写与测试.准备数据库编写微服务1和2注册到注册中心 测试 3 整合分布式处理服务整合:在微服务1

springCloud分布式事务实战(七)改造合服务BlockMicroService支持分布式事务

在BlockMicroService 工程 中加入(1)加入jar <!-- springCloud 事务 关键点1 --> <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId> <version>${lcn.last.version}</version> <exclus