什么是分布式事务?在网上找了一段比较容易理解的"定义".

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

对于在项目中接触到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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://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&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&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. springmvc atomikos mysql数据源_Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis...

    项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持 ...

  2. 分布式事务 之 04 atomikos JTA/XA全局事务

    文章目录 1. atomikos 2. 直接使用TransactionEssentials的API 2.1 新建mysql数据库表 2.2 案例代码 2.3 atomikos 源码分析 3.Trans ...

  3. SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))

    快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos  特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...

  4. Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务

    一.概念 分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.简言之,同时操作多个数据库保持事务的统一,达到跨库事务的效果. JT ...

  5. Java JDBC事务与JTA分布式事务

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...

  6. 分布式事务 之 03 JTA规范

    文章目录 1. JTA规范事务模型 2 JTA规范--接口定义 参考 相关文章: 第一篇参见原文 或 [微服务专题]17-Alibaba分布式事务组件Seata实战 01 分布式事务介绍 分布式事务 ...

  7. 【分布式事务系列九】聊聊分布式事务

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 分布式事务 [分布式事务系列一]提出疑问和研究过程 [分布式事务系列二]Spring事务管理器PlatformTra ...

  8. 原创 | 分布式事务科普(终结篇)

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"高效Java"领取<Effective Java第三版> 当当优惠码:V5 ...

  9. 分布式事务解决方案,Seata的基本配置和使用

    文章目录 1. 分布式事务介绍 ①:本地事务 ②:分布式事务 ③:常见的分布式事务解决方案 3. 2PC与3PC ①:2PC与3PC的区别 3. Seata介绍 ①:Seata的三种角色 ②:Seat ...

最新文章

  1. c语言信号灯作用,交通信号灯对交通领域的作用与影响
  2. collectors排序_Collectors.groupingBy分组后的排序问题
  3. php连接不到mysql怎么解决,怎么解决php无法连接mysql的问题
  4. 【网络基础】Mime Type
  5. Vue核心50讲 | 第四回:Vue 官方赠送的橙色装备,岂能不要
  6. OpenCV3实现人脸识别(二)——收集要识别的人脸数据集
  7. Modelsim的下载及安装
  8. 程序员你写的代码,被爆出黑产了!
  9. 红外光通信装置数字部分思路点睛 2013年国赛f题
  10. 记阿里电话面试失败过程
  11. 基于CC2430的Zigbee的第一个实验
  12. 超长指令字计算机,超长指令字
  13. kdev-ruby 停止开发,原 maintainer 转用其它编辑器
  14. 计算机内存怎么与频率匹配,内存频率,详细教您怎么查看内存条频率
  15. 跟我学RocketMQ之批量消息发送源码解析
  16. NLP面试题目汇总11-15
  17. USB Overdrive 注册码
  18. 关于DPABI头动参数问题
  19. Mybatis Plus ${ew.sqlSegment} 与 ${ew.customSqlSegment}的使用区别
  20. 《那些年啊,那些事——一个程序员的奋斗史》——14

热门文章

  1. java基础快速入门--面向对象(基础)
  2. 做好网络推广工作需要做出哪些努力?
  3. 机房空调制冷量计算方法
  4. 使用cmd命令查看电脑是不是翻新机 如何查看自己电脑是不是翻新机
  5. 精美的国外扁平化网页设计作品
  6. VB编程:VB支持XP256色的ico图标工具ArtIcons Pro附序列号-60
  7. dmidecode命令详解
  8. JAVA文法bnf,Mini Java编译器(二)——语法(BNF)-JSP教程,Java技巧及代码
  9. GameMei 简网APP工场
  10. Android——仿京东淘宝分类页面