spring+atomikos 实现的分布式事务
来源:互联网 发布:广告阻拦软件 编辑:程序博客网 时间:2024/04/24 23:49
spring +JTA + atomikos 实现分布式事务
***1 同一个web服务器,多个数据库,使用atomikos
2 跨越多个web服务器的事务,如果远程调用支持事务传播,使用JTA,如果不支持事务传播,尽量转化为一个web服务器的情况*
参考的网上一篇文章
配置了2个数据源,在一个service方法中同时向2个数据库中的表分别插入数据。
1、准备数据
create database user;CREATE TABLE `user` ( `id` int(11) DEFAULT NULL, `name` varchar(100) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;create database log;CREATE TABLE `log` ( `id` int(11) DEFAULT NULL, `content` varchar(5) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ApplicationContext.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: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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 数据库1 --> <bean id="db1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>mysql/main</value> </property> <property name="xaDataSourceClassName"> <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1</value> </property> </bean> <!-- 数据库2 --> <bean id="db2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>mysql/secondary</value> </property> <property name="xaDataSourceClassName"> <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1</value> </property> </bean> <bean id="userTransactionManager" init-method="init" destroy-method="close" class="com.atomikos.icatch.jta.UserTransactionManager"> <property name="forceShutdown" value="true" /> </bean> <bean id="userTransactionImp" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300"/> </bean> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="userTransactionManager" /> <property name="userTransaction" ref="userTransactionImp" /> <property name="allowCustomIsolationLevels" value="true"/> </bean> <!-- 配置事务传播特性 --> <tx:advice id="txAdvice" transaction-manager="jtaTransactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 事务管理 --> <aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(* com.zdp.service..*.*(..))" advice-ref="txAdvice"/> </aop:config> <bean id="userDao" class="com.zdp.dao.UserDao"> <property name="dataSource" ref="db1" /> </bean> <bean id="logDao" class="com.zdp.dao.LogDao"> <property name="dataSource" ref="db2" /> </bean> <bean id="userService" class="com.zdp.service.UserService"> <property name="userDao" ref="userDao" /> <property name="logDao" ref="logDao" /> </bean></beans>
配置文件中的SimpleDataSourceBean类的介绍:
http://blog.csdn.net/guchuanlong/article/details/12600337
2 下载附件中的内容,下载地址:http://download.csdn.net/download/zdp072/7950391
导入eclipse中,运行UserTest类中的testSave()方法,成功后2个表中都插入了数据。
模拟异常情况,因为log表的content字段长度是5,如果插入的数据长度超过5,就会异常,模拟一下这种情况,当发生异常时,2个表中都不会插入数据,即事务要么全部成功,要么全部不成功,测试通过,你自己可以试试。(备注:这个例子是网上找的,感谢这个同学)
0 0
- spring+atomikos 实现的分布式事务
- Spring + Atomikos 分布式事务实现方式
- Spring分布式事务实现Atomikos多库
- Spring分布式事务实现jotm,atomikos
- Spring + Atomikos 分布式事务实现方式
- Java事务--spring+atomikos+tomcat实现分布式事务
- Spring分布式事务配置(atomikos)
- spring atomikos 实现多数据源 分布式事务
- Postgresql 分布式事务JTA实现Atomikos与Spring集成实践
- Spring JTA接口+Atomikos实现申明式分布式事务控制
- 分布式事务JTA之实践:Spring+ATOMIKOS
- 分布式事务JTA之实践:Spring+ATOMIKOS
- 分布式事务JTA之实践:Spring+ATOMIKOS
- Atomikos Jta分布式事务spring集成实例
- Spring 3.0 + Atomikos构建jta分布式事务
- Spring-boot + atomikos + druid分布式事务配置
- 分布式事务JTA实现之:SSM+ATOMIKOS
- Springboot+atomikos+jta实现分布式事务统一管理
- Mac通过aapt命令查看apk的包名等信息
- JS判断页面是否在微信浏览器、QQ浏览器等打开的方法
- 牛客网前端技能大挑战(dom节点查找)
- devicesconsole工具介绍
- 16进制与字符串、字节数组之间的转换
- spring+atomikos 实现的分布式事务
- RuntimeException认识理解
- 【jzoj5088】【GDOI2017第四轮模拟day2】【最小边权和 】【图论】
- MATLAB filter2
- 2、AsyncTask源码分析
- CSN博客持之以恒勋章,想说爱你不容易
- java-File-mkdir与createNewFile的先后执行
- String源码解读
- 牛客网题目(三)