參考博客:https://cloud.tencent.com/developer/article/1529692
看sharding-jdbc支持XA協議重點看下面的代碼
sharding-transaction-xa-atomikos模塊中主要是原生的atomikos的配置,atomikos事務配置都是在transactions.properties中進行配置的
sharding-transaction模塊由sharding-transaction-core,sharding-transaction-2pc和sharding-transaction-base這3個子模塊組成。
Apache ShardingSphere(Incubating)能夠自動將XADataSource作為數據庫驅動的數據源接入XA事務管理器。而針對於使用DataSource作為數據庫驅動的應用,用戶也無需改變其編碼以及配置,Apache ShardingSphere(Incubating)通過自動適配的方式,在中間件內部將其轉化為支持XA協議的XADataSource和XAConnection,並將其作為XA資源注冊到底層的XA事務管理器中。
ShardingSphere還會實現XA協議的recovery部分,即在事務處理器出現崩潰的情況時,可以有能力提供in-doubt transactions來實現事務恢復。
不支持informix數據庫atomikosTransactionManager
sharding-jdbc支持事務上面的兩個注解是需要的
@Transactional表示底層使用spring的事務管理,spring底層的事務管理器使用默認的com.atomikos.icatch.jta.UserTransactionManager
<?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: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"> <!--==========針對兩個庫,各配置一個AtomikosDataSourceBean,底層都使用MysqlXADataSource=====================--> <!--配置數據源db_user--> <bean id="db_user" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="ds1" /> <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource" /> <property name="xaProperties"> <props> <prop key="url">jdbc:mysql://localhost:3306/db_user?serverTimezone=UTC</prop> <prop key="user">root</prop> <prop key="password">123456</prop> </props> </property> </bean> <!--配置數據源db_account--> <bean id="db_account" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="ds2" /> <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource" /> <property name="xaProperties"> <props> <prop key="url">jdbc:mysql://localhost:3306/db_account?serverTimezone=UTC</prop> <prop key="user">root</prop> <prop key="password">123456</prop> </props> </property> </bean> <!--=============針對兩個數據源,各配置一個SqlSessionFactoryBean============ --> <bean id="ssf_user" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="db_user" /> </bean> <bean id="ssf_account" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="db_account" /> </bean> <!--=============針對兩個SqlSessionFactoryBean,各配置一個MapperScannerConfigurer============ --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="ssf_user"/> <!--指定com.tianshouzhi.atomikos.mappers.db_user包下的UserMapper接口使用ssf_user獲取底層數據庫連接--> <property name="basePackage" value="com.tianshouzhi.atomikos.mappers.db_user"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="ssf_account"/> <!--指定com.tianshouzhi.atomikos.mappers.ds_account包下的AccountMapper接口使用ssf_account獲取底層數據庫連接--> <property name="basePackage" value="com.tianshouzhi.atomikos.mappers.ds_account"/> </bean> <!--================配置atomikos事務管理器========================--> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="false"/> </bean> <!--============配置spring的JtaTransactionManager,底層委派給atomikos進行處理===============--> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> </bean> <!--配置spring聲明式事務管理器--> <tx:annotation-driven transaction-manager="jtaTransactionManager"/> <bean id="jtaService" class="com.tianshouzhi.atomikos.JTAService"/> </beans>
第二個注解 @ShardingTransactionType(TransactionType.XA)也是需要的,改注解sharding-jdbc將一般的數據源攔截成XADatasource,將一般的事務管理器封裝成XA的事務管理器atomikosTransactionManager
這里的原理在於
https://blog.csdn.net/liu1390910/article/details/94554356
# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # com.atomikos.icatch.serial_jta_transactions = false com.atomikos.icatch.default_jta_timeout = 300000 com.atomikos.icatch.max_actives = 10000 com.atomikos.icatch.checkpoint_interval = 50000 com.atomikos.icatch.enable_logging = true com.atomikos.icatch.log_base_name = xa_tx com.atomikos.icatch.log_base_dir = ./logs