博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring+jotm+ibatis+mysql实现JTA分布式事务
阅读量:6194 次
发布时间:2019-06-21

本文共 6573 字,大约阅读时间需要 21 分钟。

1 环境

1.1 软件环境

 spring-framework-2.5.6.SEC01-with-dependencies.zip
 ibatis-2.3.4
 ow2-jotm-dist-2.1.4-bin.tar.gz
 MySQL-5.1
 JDK1.5
 
1.2 创建数据库环境
注意
mysql里数据库引擎为InnoDB,只有这样才能支持事务
1 CREATE DATABASE IF NOT EXISTS testdb_a    DEFAULT CHARACTER SET utf8;  2  3 USE testdb_a;  4  5 DROP TABLE IF EXISTS tab_a;  6  7 CREATE TABLE tab_a (  8     id bigint(20) NOT NULL,  9     name varchar(60) DEFAULT NULL, 10     address varchar(120) DEFAULT NULL, 11     PRIMARY KEY (id) 12 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 13 14 15 CREATE DATABASE IF NOT EXISTS testdb_b    DEFAULT CHARACTER SET utf8; 16 17 USE testdb_b; 18 19 DROP TABLE IF EXISTS tab_b; 20 21 CREATE TABLE tab_b ( 22     id bigint(20) NOT NULL, 23     name varchar(60) DEFAULT NULL, 24     address varchar(120) DEFAULT NULL, 25     PRIMARY KEY (id) 26 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
View Code

建立项目testJOTM

2.1 建立项目后,准备依赖的类库,结构如下

2.2 主要代码

1 /** 2  * 测试JOTM的Service 3  * 4  * @author leizhimin 2009-6-25 12:53:55 5  */ 6 public interface StuJotmService { 7     /** 8      * 同时保存TabA、TabB 9      *10      * @param a11      *            TabA对象12      * @param b13      *            TabB对象14      */15     void saveAB(TabA a, TabB b);16 17     /**18      * 同时更新TabA、TabB19      *20      * @param a21      *            TabA对象22      * @param b23      *            TabB对象24      */25     void updateAB(TabA a, TabB b);26 27     /**28      * 删除指定id的TabA、TabB记录29      *30      * @param id31      *            指定id32      */33     void deleteABif(Long id);34 }
StuJotmService
1 public class StuJotmServiceImpl implements StuJotmService { 2     private TabADAO tabADAO; 3     private TabBDAO tabBDAO; 4  5     /** 6      * 同时保存TabA、TabB 7      * 8      * @param a 9      *            TabA对象10      * @param b11      *            TabB对象12      */13 //    @Transactional(readOnly=false)14     public void saveAB(TabA a, TabB b) {15         tabADAO.saveTabA(a);16         tabBDAO.saveTabB(b);17     }18 19     /**20      * 同时更新TabA、TabB21      *22      * @param a23      *            TabA对象24      * @param b25      *            TabB对象26      */27     // @Transactional(readOnly=false)28     public void updateAB(TabA a, TabB b) {29         tabADAO.updateTabA(a);30         tabBDAO.updateTabB(b);31     }32 33     /**34      * 删除指定id的TabA、TabB记录35      *36      * @param id37      *            指定id38      */39     // @Transactional(readOnly=false)40     public void deleteABif(Long id) {41         tabADAO.deleteTabAById(id);42         tabBDAO.deleteTabBById(id);43     }44 45     public void setTabADAO(TabADAO tabADAO) {46         this.tabADAO = tabADAO;47     }48 49     public void setTabBDAO(TabBDAO tabBDAO) {50         this.tabBDAO = tabBDAO;51     }52 }
StuJotmServiceImpl
1 
2
3
10 11
12
14
15
16
classpath:jdbc.properties
17
18
19
20
21
22
23
25
26
27
28
29
30
32
33
35
36
37
38
39
40
41
42
43
44
46
47
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 72
73
74
75
76
77
78
sql-map-config_A.xml
79
80
81
82
83
84
85
86
87
sql-map-config_B.xml
88
89
90
91
92
93
94
95
96
97
98 99
100
101
102
103
104
105
106 107
108
109
110
111
112
applicationContext.xml
1 jdbc.database=cms_release 2 jdbc.driver=com.mysql.jdbc.Driver 3 jdbc.url=jdbc:mysql://192.168.0.1:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull 4 jdbc.username=root 5 jdbc.password=123456 6  7 jdbc2.database=cms_release 8 jdbc2.driver=com.mysql.jdbc.Driver 9 jdbc2.url=jdbc:mysql://192.168.0.2:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull10 jdbc2.username=root11 jdbc2.password=123456
jdbc.properties
1 
2 5 6
7
10 11
12 13
sql-map-config_A.xml
1 
2 5 6
7
10 11
12 13
sql-map-config_B.xml
1 public class Test { 2     private static ApplicationContext ctx = ApplicationContextUtil.getApplicationContext(); 3     private static StuJotmService ser = (StuJotmService) ctx.getBean("stuJotmService"); 4  5     public static void test_() { 6         TabA a = new TabA(); 7         a.setId(2L); 8         a.setName("aaa4"); 9         a.setAddress("address a4");10 11         TabB b = new TabB();12         b.setId(3L);13         b.setName("bbb3");14         b.setAddress("address b5");15         16         ser.saveAB(a, b);17     }18 19     public static void main(String[] args) {20         test_();21     }22 }

2.3 测试效果

先运行Test文件,可以看到两个库两个表都正常插入值。

 

 

再把TabA的setId改为其他任意一个长整型,那么TabB肯定会报主键重复错,因为TabB的setId没改,那么如果事务生效的话,最后应该是两张表都没插入值,如果事务没生效,那么TabA会插入一条新的数据。

 

 2.3 完整结构

 

 完整代码下载:

转载地址:http://xmuca.baihongyu.com/

你可能感兴趣的文章
JSPatch
查看>>
Ta-Lib用法介绍 !
查看>>
Apache CXF 框架结构和基本原理
查看>>
YARN中内存的设置
查看>>
Django admin 自定制
查看>>
随机ID添加
查看>>
第四十一天
查看>>
eclipse code style template
查看>>
用VS2010编C#程序扫盲
查看>>
Amoeba For MySQL读写分离
查看>>
SetFileAttributes
查看>>
python3 之__str__
查看>>
phpstudy中apache的默认根目录的配置
查看>>
JS获取屏幕,可见窗口和网页文档(html)大小
查看>>
[LeetCode]: 145: Binary Tree Postorder Traversal
查看>>
移动开发者如何获取免费流量(转载)
查看>>
javascript提升复习
查看>>
yum安装指定版本的软件包的方法
查看>>
ubuntu使用
查看>>
ubuntu下unzip解压zip文件中文乱码问题
查看>>