分布式事务是指操作多个数据库之间的事务,spring的 org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持。如果使 用WAS的JTA支持,把它的属性改为WebSphere对应的TransactionManager。
在tomcat下,是没有分布式事务的,不过可以借助于第三方软件jotm(Java Open Transaction Manager )和AtomikosTransactionsEssentials实现,在spring中分布式事务是通过jta(jotm,atomikos)来进行 实现。
1、http://jotm.objectweb.org/
2、http://www.atomikos.com/Main/TransactionsEssentials
一、使用JOTM例子
(1)、Dao及实现
- public interface GenericDao {
- public int save(String ds, String sql, Object[] obj) throws Exception;
- public int findRowCount(String ds, String sql);
- }
- public class GenericDaoImpl implements GenericDao{
- private JdbcTemplate jdbcTemplateA;
- private JdbcTemplate jdbcTemplateB;
- public void setJdbcTemplateA(JdbcTemplate jdbcTemplate) {
- this .jdbcTemplateA = jdbcTemplate;
- }
- public void setJdbcTemplateB(JdbcTemplate jdbcTemplate) {
- this .jdbcTemplateB = jdbcTemplate;
- }
- public int save(String ds, String sql, Object[] obj) throws Exception{
- if ( null == ds || "" .equals(ds)) return - 1 ;
- try {
- if (ds.equals( "A" )){
- return this .jdbcTemplateA.update(sql, obj);
- }else {
- return this .jdbcTemplateB.update(sql, obj);
- }
- }catch (Exception e){
- e.printStackTrace();
- throw new Exception( "执行" + ds + "数据库时失败!" );
- }
- }
- public int findRowCount(String ds, String sql) {
- if ( null == ds || "" .equals(ds)) return - 1 ;
- if (ds.equals( "A" )){
- return this .jdbcTemplateA.queryForInt(sql);
- }else {
- return this .jdbcTemplateB.queryForInt(sql);
- }
- }
- }
(2)、Service及实现
- public interface UserService {
- public void saveUser() throws Exception;
- }
- public class UserServiceImpl implements UserService{
- private GenericDao genericDao;
- public void setGenericDao(GenericDao genericDao) {
- this .genericDao = genericDao;
- }
- public void saveUser() throws Exception {
- String userName = "user_" + Math.round(Math.random()* 10000 );
- System.out.println(userName);
- StringBuilder sql = new StringBuilder();
- sql.append(" insert into t_user(username, gender) values(?,?); " );
- Object[] objs = new Object[]{userName, "1" };
- genericDao.save("A" , sql.toString(), objs);
- sql.delete(0 , sql.length());
- sql.append(" insert into t_user(name, sex) values(?,?); " );
- objs = new Object[]{userName, "男的" }; //值超出范围
- genericDao.save("B" , sql.toString(), objs);
- }
- }
(3)、applicationContext-jotm.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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
- < description > springJTA </ description >
- <!--指定Spring配置中用到的属性文件-->
- < bean id = "propertyConfig"
- class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
- < property name = "locations" >
- < list >
- < value > classpath:jdbc.properties </ value >
- </ list >
- </ property >
- </ bean >
- <!-- JOTM实例 -->
- < bean id = "jotm" class = "org.springframework.transaction.jta.JotmFactoryBean" >
- < property name = "defaultTimeout" value = "500000" />
- </ bean >
- <!-- JTA事务管理器 -->
- < bean id = "jtaTransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
- < property name = "userTransaction" ref = "jotm" />
- </ bean >
- <!-- 数据源A -->
- < bean id = "dataSourceA" 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 = "${jdbc.driver}" />
- < property name = "url" value = "${jdbc.url}" />
- </ bean >
- </ property >
- < property name = "user" value = "${jdbc.username}" />
- < property name = "password" value = "${jdbc.password}" />
- </ bean >
- <!-- 数据源B -->
- < bean id = "dataSourceB" 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 = "${jdbc2.driver}" />
- < property name = "url" value = "${jdbc2.url}" />
- </ bean >
- </ property >
- < property name = "user" value = "${jdbc2.username}" />
- < property name = "password" value = "${jdbc2.password}" />
- </ bean >
- < bean id = "jdbcTemplateA"
- class = "org.springframework.jdbc.core.JdbcTemplate" >
- < property name = "dataSource" ref = "dataSourceA" />
- </ bean >
- < bean id = "jdbcTemplateB"
- class = "org.springframework.jdbc.core.JdbcTemplate" >
- < property name = "dataSource" ref = "dataSourceB" />
- </ bean >
- <!-- 事务切面配置 -->
- < aop:config >
- < aop:pointcut id = "pointCut"
- expression = "execution(* com.logcd.service..*.*(..))" /> <!-- 包及其子包下的所有方法 -->
- < aop:advisor pointcut-ref = "pointCut" advice-ref = "txAdvice" />
- < aop:advisor pointcut = "execution(* *..common.service..*.*(..))" advice-ref = "txAdvice" />
- </ aop:config >
- <!-- 通知配置 -->
- < tx:advice id = "txAdvice" transaction-manager = "jtaTransactionManager" >
- < tx:attributes >
- < tx:method name = "delete*" rollback-for = "Exception" />
- < tx:method name = "save*" rollback-for = "Exception" />
- < tx:method name = "update*" rollback-for = "Exception" />
- < tx:method name = "find*" read-only = "true" rollback-for = "Exception" />
- </ tx:attributes >
- </ tx:advice >
- < bean id = "genericDao"
- class = "com.logcd.dao.impl.GenericDaoImpl" autowire = "byName" >
- </ bean >
- < bean id = "userService"
- class = "com.logcd.service.impl.UserServiceImpl" autowire = "byName" >
- </ bean >
- </ beans >
(4)、测试
- public class TestUserService{
- private static UserService userService;
- @BeforeClass
- public static void init(){
- ApplicationContext app = new ClassPathXmlApplicationContext( "applicationContext-jotm.xml" );
- userService = (UserService)app.getBean("userService" );
- }
- @Test
- public void save(){
- System.out.println("begin..." );
- try {
- userService.saveUser();
- }catch (Exception e){
- System.out.println(e.getMessage());
- }
- System.out.println("finish..." );
- }
- }
二、关于使用atomikos实现
(1)、数据源配置
- < bean id = "dataSourceA" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
- < property name = "uniqueResourceName" >
- < value > ${datasource.uniqueResourceName} </ value >
- </ property >
- < property name = "xaDataSourceClassName" >
- < value > ${database.driver_class} </ value >
- </ property >
- < property name = "xaDataSourceProperties" >
- < value > URL =${database.url}; user =${database.username}; password =${database.password} </ value >
- </ property >
- < property name = "exclusiveConnectionMode" >
- < value > ${connection.exclusive.mode} </ value >
- </ property >
- < property name = "connectionPoolSize" >
- < value > ${connection.pool.size} </ value >
- </ property >
- < property name = "connectionTimeout" >
- < value > ${connection.timeout} </ value >
- </ property >
- < property name = "validatingQuery" >
- < value > SELECT 1 </ value >
- </ property >
- </ bean >
(2)、事务配置
- < bean id = "atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager"
- init-method = "init" destroy-method = "close" >
- < property name = "forceShutdown" value = "true" />
- </ bean >
- < bean id = "atomikosUserTransaction" class = "com.atomikos.icatch.jta.UserTransactionImp" >
- < property name = "transactionTimeout" value = "${transaction.timeout}" />
- </ bean >
- <!-- JTA事务管理器 -->
- < bean id = "springTransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
- < property name = "transactionManager" ref = "atomikosTransactionManager" />
- < property name = "userTransaction" ref = "atomikosUserTransaction" />
- </ bean >
- <!-- 事务切面配置 -->
- < aop:config >
- < aop:pointcut id = "serviceOperation" expression = "execution(* *..service*..*(..))" />
- < aop:advisor pointcut-ref = "serviceOperation" advice-ref = "txAdvice" />
- </ aop:config >
- <!-- 通知配置 -->
- < tx:advice id = "txAdvice" transaction-manager = "springTransactionManager" >
- < tx:attributes >
- < tx:method name = "*" rollback-for = "Exception" />
- </ tx:attributes >
- </ tx:advice >
相关推荐
总结来说,Spring分布式事务实现主要依赖于Spring框架的事务管理能力、JOTM作为JTA实现的事务管理器,以及相关的JDBC驱动来连接数据库。通过声明式事务管理,开发者可以在不深入事务管理细节的情况下,编写出可靠的...
spring分布式配置详解,并有testng测试报告, 公司封了端口,下载后,把后缀名改为rar就行了
Spring 分布式事务管理是大型企业级应用中不可或缺的一部分,它允许在多个数据库或服务之间进行一致性的数据操作。Atomikos 是一个开源的事务管理器,特别适用于 Spring 应用,提供了强大的分布式事务处理能力。这篇...
Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM(Java Open Transaction Manager)来处理分布式事务。本文将深入探讨Spring与JOTM结合使用的知识点,帮助...
6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-DB.链式事务管理器 6-6 实例2-JPA-DB.链式事务管理器 6-7 实例3-JMS-DB.最大努力一次提交 6-8 分布式事务实现模式与技术 6-9 全局一致性ID和...
本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...
在Java中,实现分布式事务的方法有很多,例如使用JTA(Java Transaction API)或者Spring框架的声明式事务管理。 1. **JTA(Java Transaction API)**:这是Java平台的标准API,用于管理全局事务,可以跨越多个资源...
本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...
spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务
SpringBoot提供了多种分布式事务管理器,如JTA(Java Transaction API)和Spring的PlatformTransactionManager。 JTA是Java EE平台的标准,支持全局事务。在SpringBoot中,可以使用Atomikos或Bitronix这样的第三方...
本文将深入探讨如何在Spring Cloud环境中整合分布式事务框架TX-LCN,以实现高效、一致的数据操作。 TX-LCN(Transaction for LCN)是一个轻量级的分布式事务解决方案,它为Java开发者提供了一种简单易用的方式来...
Spring 整合 Atomikos 实现分布式事务是解决在分布式环境下多个数据库操作一致性问题的关键技术。Atomikos 是一个开源的事务管理器,它为 Java 平台提供了强大的支持,特别是处理跨越多个数据库的事务需求。在分布式...
Spring、Hibernate和JTA(Java Transaction API)是Java开发者在构建分布式事务解决方案时常用的三大技术。本示例“第二部分spring+hibernate+jta 分布式事务Demo”将帮助我们理解如何在这三个框架之间协同工作,...
本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...
分布式事务是Spring分布式架构中的一个重要概念,即多个微服务之间的交互可以作为一个事务来处理。分布式事务可以确保多个微服务之间的数据一致性和事务一致性。 CAP定理是Spring分布式架构中的一个重要概念,即在...
本教程将深入探讨如何在Spring Boot环境下实现多数据源操作及分布式事务管理,并加入对多线程的支持。 首先,我们来理解多数据源的概念。在大型系统中,往往需要连接多个数据库,如主库、从库、测试库等。Spring ...
Spring2.5+hibernate搞定分布式事务Spring2.5+hibernate搞定分Spring2.5+hibernate搞定分布式事务布式事务 第三部分
本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...
Spring框架提供了强大的事务管理功能,而分布式事务则是处理多数据库操作时的关键技术。本篇将详细讲解如何在Spring环境中结合Druid数据源和Hibernate ORM框架,利用Atomikos实现JTA(Java Transaction API)来配置...