分布式事务是指事务的参与者、支持事务的服务器、资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算机资源上访问并且更新数据,将两个或多个网络计算机的数据进行的多次操作作为一个整体进行处理。如不同银行账户之间的转账。

对于在项目中接触到JTA,大部分的原因是因为在项目中需要操作多个数据库,同时,可以保证操作的原子性,保证对多个数据库的操作一致性。

在正式的项目中应该用springMVC(struts)+spring+hibernate(jpa)+jta,目前,先用spring+jta来完成基本的测试框架。下面我们看看代码

applicationContext-jta.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/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- jotm 本地实例 -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /> <!-- JTA事务管理器 -->
<bean id="txManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm"></property>
</bean> <!-- XAPool配置,内部包含了一个XA数据源,对应sshdb数据库 -->
<bean id="db1" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<!-- 内部XA数据源 -->
<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://192.168.1.28:3306/sshdb?useUnicode=true&amp;characterEncoding=UTF-8" />
</bean>
</property>
<property name="user" value="root" />
<property name="password" value="123456" />
</bean> <!-- 另一个XAPool配置,内部包含另一个XA数据源,对应babasport数据库 -->
<bean id="db2" 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="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://192.168.1.28:3306/babasport?useUnicode=true&amp;characterEncoding=UTF-8" />
</bean>
</property>
<property name="user" value="root" />
<property name="password" value="123456" />
</bean> <!-- 配置访问sshdb数据源的Spring JDBC模板 -->
<bean id="sshdbTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="db1"></property>
</bean> <!-- 配置访问babasport数据源的Spring JDBC模板 -->
<bean id="babasportTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="db2"></property>
</bean>
</beans>

小注一下:spring-tx-3.2.4.jar里面竟然没有org.springframework.transaction.jta.JotmFactoryBean类,如果你可以选择spring-tx-2.5.6.jar,或者自己建立一下这个类。

接下来,看下dao层测试的代码

  1     @Resource(name = "txManager")
2 private JtaTransactionManager txManager;
9
10 protected JdbcTemplate babasport_jdbcTemplate;
11
12 /**
13 * sshdb sql jdbcTemplate
14 */
15 protected JdbcTemplate ssh_jdbcTemplate;
16
17 /**
18 * babasport sql jdbcTemplate
19 *
20 * @return
21 */
22 public JdbcTemplate getBabasport_jdbcTemplate() {
23 return babasport_jdbcTemplate;
24 }
25
26 public JdbcTemplate getSsh_jdbcTemplate() {
27 return ssh_jdbcTemplate;
28 }
29
30 @Resource(name = "babasportTemplate")
31 public void setBabasport_jdbcTemplate(JdbcTemplate babasport_jdbcTemplate) {
32 this.babasport_jdbcTemplate = babasport_jdbcTemplate;
33 }
34
35 @Resource(name = "sshdbTemplate")
36 public void setSsh_jdbcTemplate(JdbcTemplate ssh_jdbcTemplate) {
37 this.ssh_jdbcTemplate = ssh_jdbcTemplate;
38 }
39
40 /**
41 * 同时修改两个数据库的表中内容
42 *
43 * @throws RollbackException
44 */
45 public void updateMultiple() {
46
47 if (null == this.txManager) {
48 System.out.println("txManager为空");
49 return;
50 }
51
52 UserTransaction userTx = this.txManager.getUserTransaction();
53 if (null == userTx) {
54 System.out.println("userTx为空");
55 return;
56 }
57
58 try {
59
60 userTx.begin();
61
62 this.ssh_jdbcTemplate
63 .execute("update wyuser set password='wangyong1' where id=8");
64
65
66 this.babasport_jdbcTemplate
67 .execute("update brand set name='wangyong28' where code='14ac8d5b-d19c-40e9-97ea-d82dfbcd84c6'");
68
69 userTx.commit();
70 } catch (Exception e) {
71 System.out.println("捕获到异常,进行回滚" + e.getMessage());
72 e.printStackTrace();
73 try {
74 userTx.rollback();
75 } catch (IllegalStateException e1) {
76 System.out.println("IllegalStateException:" + e1.getMessage());
77 } catch (SecurityException e1) {
78 System.out.println("SecurityException:" + e1.getMessage());
79 } catch (SystemException e1) {
80 System.out.println("SystemException:" + e1.getMessage());
81 }
82 // System.out.println("sql语句操作失败");
83 }
84 }

如果,将后一条update语句故意写错,就会发现会执行rollback,同时,对上面一个语句的操作也不会生效。基本的简单框架就是这样。

其实,之前也测试了下spring+jpa+jta的框架模式,却发现,在建立model层实体类的时候会有问题,建立的entity类映射到所有的数据库中了,于是在jpa中利用属性<property name="packagesToScan" value="包名" />这种方式的确可以解决实体类entity的映射问题,不过貌似又出现其他问题,待研究.......

传统Spring配置JTA 实现多数据源事务的统一管理的更多相关文章

  1. spring+springmvc+mybatis+oracle+atomikos+jta实现多数据源事务管理

    ---恢复内容开始---   在做项目过程中,遇到了需要一个项目中访问两个数据库的情况,发现使用常规的spring管理事务,导致事务不能正常回滚,因此,采用了jta+atomikos的分布式数据源方式 ...

  2. spring boot 或 spring 集成 atomikos jta 完成多数据源事务管理

    前言:对于事务,spring 不提供自己的实现,只是定义了一个接口来供其他厂商实现,具体些的请看我的这篇文章: https://www.cnblogs.com/qiaoyutao/p/11289996 ...

  3. Spring Boot2.0之多数据源事务管理

    结合前面做的小项目,如果我把test01 test02下面的 service 都加了 事务的注解 这样启动时候会报错! 事务管理器里面不能有两个事务!!!! 这时候需要用  @Transactiona ...

  4. spring + ibatis 多数据源事务(分布式事务)管理配置方法(转)

    spring + ibatis 多数据源事务(分布式事务)管理配置方法(转) .我先要给大家讲一个概念:spring 的多数据源事务,这是民间的说法.官方的说法是:spring 的分布式事务.明白了这 ...

  5. Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  6. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  7. 二、spring集成ibatis进行数据源事务管理拦截器环境配置

    1.dataSource-applicationContext.xml文件配置理解:(spring1.2.8+ibatis1.5.3)1.1)配置数据源 DriverManagerDataSource ...

  8. Spring配置事务 http://www.cnblogs.com/leiOOlei/p/3725911.html

    http://www.cnblogs.com/leiOOlei/p/3725911.html JNDI方式配置数据源: <?xml version="1.0" encodin ...

  9. Spring配置多个数据源

    Spring 配置多数据源实现数据库读写分离 博客分类: Spring 数据库   现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Mast ...

随机推荐

  1. 操作MySQL数据进行记录的随意排序

    说到排序,想必大家都知道MySQL中的“ORDER BY”这个关键词吧,使用它可以实现查询数据根据某一字段(或多个字段)的值排序,那么如何实现数据的任意排序操作呢? 其实这里我所说的“随意排序”,本质 ...

  2. 【AtCoder】AGC002

    AGC002 A - Range Product #include <bits/stdc++.h> #define fi first #define se second #define p ...

  3. C++ STL String学习 (待续)

    头文件:<string> 字符串类初始化: string s1="aabbba"; s2=string("bbb"); string s3=stri ...

  4. Centos7下,宿主机nginx配合docker环境的php-fpm

    一.安装docker并启动 yum install docker systemctl start docker 二.安装nginxCentOS 7默认不能从yum中安装nginx,原因可以自己搜索一下 ...

  5. php源码安装执行configure报错error: off_t undefined; check your library configuration

    php安装执行configure报错error: off_t undefined; check your library configuration vim /etc/ld.so.conf 添加如下几 ...

  6. django类视图的使用

    1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解. 但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳 ...

  7. 教你如何进行移动端APP测试

    1.安全测试(权限) 1)软件权限:其中包括发送信息,拨打电话,链接网络,访问手机信息,联系人信息等等 2)数据在本地的存储.传输等 3)执行某些操作时导致的输入有效性验证.授权.数据加密等方面 4) ...

  8. Django模型(model)系统

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  9. JS写斐波那契数列的几种方法

    斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...

  10. 【php设计模式】观察者模式

    当对象间存在一对多关系时,则使用观察者模式.比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. <?php class Subject{ private $obser ...