Spring在tomcat下使用JTA事务

Springtomcat下使用JTA事务

涉及到多个库的事务问题时,常常要使用到JTA事务,tomcat本身不支持JTA事务,需要借助于Atomikos来使用JTA事务。以下内容结合mybatis,在项目中配置JTA事务。

1,引入依赖

<dependency>

<groupId>javax.transaction</groupId>

<artifactId>jta</artifactId>

<version>1.1</version>

</dependency>

<dependency>

<groupId>com.atomikos</groupId>

<artifactId>transactions-jdbc</artifactId>

<version>4.0.4</version>

</dependency>

2,引入properties配置,配置数据源

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath:config.properties</value>

</list>

</property>

</bean>

配置数据源

      <bean id="storeDS" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close">

       <property name="uniqueResourceName" value="storeDS"/>  

       <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>

       <property name="xaProperties">  

         <props>  

             <prop key="url">${store_db.url}</prop>  

             <prop key="user">${store_db.username}</prop>  

             <prop key="password">${store_db.password}</prop>  

         </props>  

     </property>

     <property name="minPoolSize" value="5" />  

    <property name="maxPoolSize" value="20" />  

    <!-- 锁表时间 -->

    <property name="borrowConnectionTimeout" value="120" />  

    <property name="testQuery" value="select 1" />  

    <property name="maintenanceInterval" value="60" /> 

      </bean>

      

       <bean id="hanjudbDS" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close">

       <property name="uniqueResourceName" value="hanjudbDS"/>  

       <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>

       <property name="xaProperties">  

         <props>  

             <prop key="url">${url}</prop>  

             <prop key="user">${username}</prop>  

             <prop key="password">${password}</prop>  

         </props>  

     </property>

     <property name="minPoolSize" value="10" />  

    <property name="maxPoolSize" value="40" />  

    <!-- 锁表时间 -->

    <property name="borrowConnectionTimeout" value="120" />  

    <property name="testQuery" value="select 1" />  

    <property name="maintenanceInterval" value="60" /> 

      </bean>

3,配置连接池,使用mybatis连接池

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="hanjudbDS" />

<property name="mapperLocations" value="classpath:com.ttt.server.dal.**.dao/**Dao.xml" />

  </bean>

  <bean id="storeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="storeDS" />

<property name="mapperLocations"

value="classpath:com.ttt.server.dal.**.storedao/**StoreDao.xml" />

  </bean>

4,配置mybatis

  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

<property name="basePackage" value="com.hanju.server.dal.**.dao" />

  </bean>

  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="sqlSessionFactoryBeanName" value="storeSqlSessionFactory"/>

<property name="basePackage" value="com.hanju.server.dal.**.storedao" />

  </bean>

 

5,配置事务

<!-- 引入spring注解事务 -->

  <tx:annotation-driven />

  

  <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  

     <property name="transactionManager">  

        <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">  

            <property name="forceShutdown" value="true"/>  

        </bean>  

     </property>  

     <property name="userTransaction">  

         <bean class="com.atomikos.icatch.jta.UserTransactionImp"/>  

        </property>  

  </bean>

  

  <tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="get*" propagation="SUPPORTS" read-only="true" />

<tx:method name="find*" propagation="SUPPORTS" read-only="true" />

<tx:method name="check*" propagation="SUPPORTS" read-only="true" />

<tx:method name="is*" propagation="SUPPORTS" read-only="true" />

<tx:method name="search*" propagation="SUPPORTS" read-only="true" />

<tx:method name="select*" propagation="SUPPORTS" read-only="true" />

<tx:method name="*" propagation="REQUIRED" read-only="false"

timeout="120" rollback-for="java.lang.Exception" />

</tx:attributes>

  </tx:advice>

 

  <aop:config>

<aop:pointcut

expression="execution(* com.ttt.server..*Service.*(..)) and !@annotation(com.ttt.server.common.annotation.TTTNoTransaction)"

id="txTransactionPC" />

<aop:advisor advice-ref="txAdvice" pointcut-ref="txTransactionPC" />

  </aop:config>

6classpath下增加jta.properties文件

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory   

com.atomikos.icatch.console_file_name=tm.out   

com.atomikos.icatch.log_base_name=tmlog   

com.atomikos.icatch.tm_unique_name =com.atomikos.spring.jdbc.tm   

com.atomikos.icatch.console_log_level=INFO 

com.atomikos.icatch.max_actives=200

 

Boot分布式事务的解决方案是JTA,即Java Transaction API。Spring Boot官方提供了Atomikos的解决思路。在项目中引入Atomikos的依赖,然后在配置文件中配置数据源和事务管理器即可实现分布式事务。具体步骤如下: 1.在pom.xml文件中引入Atomikos的依赖: ```xml <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <version>4.0.6</version> </dependency> ``` 2.在application.properties文件中配置数据源和事务管理器: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jta.atomikos.datasource.ds1.unique-resource-name=ds1 spring.jta.atomikos.datasource.ds1.xa-data-source-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource spring.jta.atomikos.datasource.ds1.xa-properties.url=jdbc:mysql://localhost:3306/test spring.jta.atomikos.datasource.ds1.xa-properties.user=root spring.jta.atomikos.datasource.ds1.xa-properties.password=root spring.jta.atomikos.transaction-manager-id=tm ``` 3.在代码中使用@Transactional注解开启事务: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Transactional @Override public void transfer(int fromUserId, int toUserId, double amount) { userDao.decreaseBalance(fromUserId, amount); userDao.increaseBalance(toUserId, amount); } } ``` 以上就是Spring Boot分布式事务的解决方案。需要注意的是,使用JTA需要在应用服务器中配置JTA事务管理器,例如Tomcat需要配置Bitronix或Atomikos。同时,JTA也有一些缺点,例如性能较差,配置较为复杂等。因此,在实际项目中需要根据具体情况选择合适的事务解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值