atomikos+springmvc+myibaits+mysql分布式事务

本文详细介绍了如何在Spring框架下配置多个数据源,并通过MyBatis进行数据库操作。同时,深入探讨了如何利用Atomikos实现JTA事务管理,确保跨数据源事务的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置文件

<bean id="clrreportDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close">
	<!-- 该数据源唯一的名称,不能重复 -->
	<property name="uniqueResourceName" value="defaultDataSource"/>
	<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
    <property name="borrowConnectionTimeout" value="60" />     
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
	<property name="xaProperties">
        <props>
            <prop key="url">${clrreport.jdbc.url}</prop>    
            <prop key="user">${clrreport.jdbc.username}</prop>    
            <prop key="password">${clrreport.jdbc.password}</prop>    
           
        </props>    
    </property>
</bean>

<!-- 定义主业务使用的sqlSessionFactory -->
<bean id="sqlSessionFactory-clrreport" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="clrreportDataSource" />
	<property name="mapperLocations" value="classpath:META-INF/mybatis/mapper/invoice/report/*.xml" />
</bean>
<!-- 扫描mybatis的接口所在的文件 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<!-- 扫描mybatis对应的java interface文件    -->
	<property name="basePackage" value="com.wangyin.sis.invoice.dao.report" />
	<!-- 配置多数据源的情况,必须使用sqlSessionFactoryBeanName指定sqlSessionFactory -->
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory-clrreport"/>
</bean>
<bean id="szreportDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"  destroy-method="close" >
    <!-- 该数据源唯一的名称,不能重复 -->
	<property name="uniqueResourceName" value="defaultDataSource1"/>
	<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
    <property name="borrowConnectionTimeout" value="60" />     
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
	<property name="xaProperties">
        <props>
            <prop key="url">${szreport.jdbc.url}</prop>    
            <prop key="user">${szreport.jdbc.username}</prop>    
            <prop key="password">${szreport.jdbc.password}</prop>    
           
        </props>    
    </property>
</bean>
<bean id="sqlSessionFactory-szreport" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="szreportDataSource" />
	<property name="mapperLocations" value="classpath:META-INF/mybatis/mapper/invoice/rzreport/*.xml" />
</bean>
<!-- 扫描mybatis的接口所在的文件 -->
<bean id="mapperScannerConfigurer4MiddleTable" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.wangyin.sis.invoice.dao.rzreport" />
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory-szreport"/>
</bean>

<!-- jta分布式事务 -->
<!-- Atomikos 事务管理器配置 -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
	init-method="init" destroy-method="close">
	<!-- <property name="startupTransactionService" value="false" /> -->
	<!-- close()时是否强制终止事务 -->
	<property name="forceShutdown" value="true" />
</bean>

<!-- Atomikos UserTransaction配置 -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
         <property name="transactionTimeout" value="300"/>
</bean>

<!-- JTA事务管理器 -->
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
	<property name="transactionManager">
		<ref bean="atomikosTransactionManager" />
	</property>
	<property name="userTransaction">
		<ref bean="atomikosUserTransaction" />
	</property>
	 <property name="allowCustomIsolationLevels" value="true"/>    
</bean>

<!-- 开启spring注解事务 -->
<tx:annotation-driven transaction-manager="txManager" />

涉及jar
< dependency>
< groupId>javax.transaction</ groupId >
< artifactId>jta</ artifactId>
< version>1.1</ version>
</ dependency>
< dependency>
< groupId>com.atomikos</ groupId>
< artifactId>atomikos-util</ artifactId>
< version>4.0.2</ version>
</ dependency>
< dependency>
< groupId>com.atomikos</ groupId>
< artifactId>transactions</ artifactId>
< version>4.0.2</ version>
</ dependency>
< dependency>
< groupId>com.atomikos</ groupId>
< artifactId>transactions-jta</ artifactId>
< version>4.0.2</ version>
</ dependency>
< dependency>
< groupId>com.atomikos</ groupId>
< artifactId>transactions-jdbc</ artifactId>
< version>4.0.2</ version>
</ dependency>
< dependency>
< groupId>com.atomikos</ groupId>
< artifactId>transactions-api</ artifactId>
< version>4.0.2</ version>
</ dependency>

配置文件
jta.properties
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.console_file_name = rm.out
com.atomikos.icatch.log_base_name = rmlog
com.atomikos.icatch.default_jta_timeout = 3000000
com.atomikos.icatch.max_timeout = 0

service代码
@Resource
JtaTransactionManager txManager;
try {
txManager.getUserTransaction().begin();
SisSetInvoiceAll sisSetInvoiceAll=getSisSetInvoiceAll(tradeAmt,merFee,startTime,endTime, merId, memberId,InvoiceSource.DAIFU.getValue(),endTime,batchId);
//更新批次号
int result= sisMerDetailMapper.updateReportBatchId(memberId, startTime,endTime, batchId);
if(result>0){
sisSetInvoiceAllMapper.insertSisSetInvoiceAll(sisSetInvoiceAll);
}
txManager.getUserTransaction().commit();
} catch (Exception e) {
try {
txManager.getUserTransaction().rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值