转载 spring+atomikos+JTA完整例子

本文详细介绍了如何使用Atomikos进行JTA事务管理的配置,并展示了如何为两个不同的MySQL数据源设置XADatasource以实现分布式事务。
原文:http://www.blogjava.net/pdw2009/archive/2008/05/25/202725.html

applicationContext.xml配置

<!--Atomikos JTA 事务 begin-->
<bean id="dataSource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/main</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="dataSource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/secondary</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/aotsf?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
<property name="forceShutdown"><value>true</value></property>
</bean>


<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300"/>
</bean>
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction"/>
</property>
</bean>

<bean id="atomikosTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="springTransactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>


<bean id="jdbcBookDAO" class="dao.jdbc.BookDAO">
<property name="dataSource">
<ref bean="dataSource1"/>
</property>
</bean>

<bean id="jdbcTestDAO" class="dao.jdbc.TestDAO">
<property name="dataSource">
<ref bean="dataSource2"/>
</property>
</bean>

<bean id="atomikosJTAServiceDemo" parent="atomikosTransactionProxy">
<property name="target">
<bean class="service.AtomikosJTAServiceDemo">
<property name="jdbcBookDAO">
<ref bean="jdbcBookDAO"/>
</property>
<property name="jdbcTestDAO">
<ref bean="jdbcTestDAO"/>
</property>
</bean>
</property>
</bean>


<!--Atomikos JTA 事务 end -->
### 关于 Spring Boot 3.x 中 `spring-boot-starter-jta-atomikos` 的配置与使用 #### 依赖引入 在 Spring Boot 3.x 版本中,为了支持 JTAJava Transaction API),可以继续通过 Maven 或 Gradle 添加 Atomikos Starter 作为依赖项。以下是基于 Maven 的示例: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency> ``` 此依赖会自动拉取必要的库来启用分布式事务功能[^2]。 --- #### 数据源配置 对于多数据源场景下的事务管理,需定义多个 XA 数据源并将其注册到应用上下文中。以下是一个典型的 MySQL 配置示例: ```properties # Primary Data Source Configuration spring.jta.atomikos.datasource.primary.unique-resource-name=primaryDS spring.jta.atomikos.datasource.primary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource spring.jta.atomikos.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.jta.atomikos.datasource.primary.user=root spring.jta.atomikos.datasource.primary.password=password # Secondary Data Source Configuration spring.jta.atomikos.datasource.secondary.unique-resource-name=secondaryDS spring.jta.atomikos.datasource.secondary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource spring.jta.atomikos.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.jta.atomikos.datasource.secondary.user=root spring.jta.atomikos.datasource.secondary.password=password ``` 以上属性指定了两个不同的数据库连接池及其对应的资源名称[^3]。 --- #### 启用全局事务管理器 默认情况下,Spring Boot 将自动检测是否存在 JTA 支持,并初始化相应的事务管理器实例 (`UserTransactionManager`) 和同步工厂 (`SynchronizationFactory`)。如果需要自定义行为,则可以通过 Java Config 实现更精细控制: ```java import com.atomikos.icatch.config.UserTransactionServiceImp; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JtaConfig { @Bean(initMethod = "init", destroyMethod = "close") public UserTransactionServiceImp userTransactionService() { return new UserTransactionServiceImp(); } } ``` 上述代码片段展示了如何手动创建和注入 `UserTransactionServiceImp` 豆类以增强灵活性[^2]。 --- #### 测试案例 下面提供了一个简单的测试服务用于验证跨多个数据源的操作是否被纳入同一事务范围之内: ```java @Service @.Transactional public class MultiDatasourceService { private final PrimaryRepository primaryRepo; private final SecondaryRepository secondaryRepo; public MultiDatasourceService(PrimaryRepository primaryRepo, SecondaryRepository secondaryRepo) { this.primaryRepo = primaryRepo; this.secondaryRepo = secondaryRepo; } public void performTransactionalOperation(String dataForPrimary, String dataForSecondary) { primaryRepo.save(new PrimaryEntity(dataForPrimary)); if (true) { // Simulate an exception to rollback the transaction. throw new RuntimeException("Simulated error"); } secondaryRepo.save(new SecondaryEntity(dataForSecondary)); } } ``` 在此例子中,当异常发生时整个操作会被回滚至初始状态[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值