分布式事务atomikos的原理_spring分布式事务

分布式事务atomikos的原理_spring分布式事务atomikos+jta+JdbcTemplate依赖包(部分)事务等配置jta.properties(修改默认配置使用)测试,JdbcTemplate操作数据库@Transactional

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

atomikos+jta+JdbcTemplate

依赖包(部分)

<!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>
        
     
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
<dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-jdbc</artifactId>
            <version>3.9.3</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
<!--atomikos是分布式事务使用,jta是spring整合分布式事务使用 -->

事务等配置

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jta.properties</value><!-- 修改默认配置使用 -->
                <value>classpath:jdbc.properties</value>
                <value>classpath:rpc.properties</value>
                <value>classpath:redis.properties</value>
                <value>classpath:servicesetting.properties</value>
            </list>
        </property>
    </bean>

    <!-- 数据源 -->
    <bean id="abstractDatasource" abstract="true"
            class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        <property name="poolSize" value="${datasource.poolSize}" />
        <property name="minPoolSize" value="${datasource.minPoolSize}" />
        <property name="maxPoolSize" value="${datasource.maxPoolSize}" />
        <!--获取连接失败重新获等待最大时间,在这个时间内如果有可用连接,将返回 -->
        <property name="borrowConnectionTimeout" value="60" />
        <!--最大获取数据时间,如果不设置这个值,Atomikos使用默认的5分钟,那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset 
            is close 的错误. -->
        <property name="reapTimeout" value="20" />
        <!--最大闲置时间,超过最小连接池连接的连接将将关闭 -->
        <property name="maxIdleTime" value="${datasource.maxIdleTime}" />
        <!--连接回收时间 -->
        <property name="maintenanceInterval" value="60" />
        <!--java数据库连接池,最大可等待获取datasouce的时间 -->
        <property name="loginTimeout" value="60" />
        <property name="logWriter" value="60" />
        <!-- <property name="maxLifetime" value="1800000"/> -->
        <property name="testQuery">
            <value>select 1</value>
        </property>
    </bean>

    <!-- atomikos事务管理器 -->
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
        init-method="init" destroy-method="close">
        <description>UserTransactionManager</description>
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>

    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300" />
    </bean>

    <!-- spring 事务管理器,包装了atomikos事务 -->
    <bean id="jtaTransactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager">
            <ref bean="atomikosTransactionManager" />
        </property>
        <property name="userTransaction">
            <ref bean="atomikosUserTransaction" />
        </property>
    </bean>

    <!-- spring 事务模板,和spring的jta事务类似功能 -->
    <bean id="transactionTemplate"
        class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager">
            <ref bean="jtaTransactionManager" />
        </property>
    </bean>
<!-- 声明式事务使用 -->
<tx:annotation-driven transaction-manager="jtaTransactionManager" /> <bean id="dataSource0_navi_w_0" parent="abstractDatasource"> <property name="uniqueResourceName" value="mysql/navi_w_0" /> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /> <property name="xaProperties"> <props> <prop key="URL">${navi_w_0.url}</prop> <prop key="user">${navi_w_0.user}</prop> <prop key="password">${navi_w_0.password}</prop> <prop key="pinGlobalTxToPhysicalConnection">true</prop> <prop key="autoReconnect">true</prop> </props> </property> <property name="maxPoolSize" value="${c3p0_r.maxPoolSize}" /> </bean> <bean id="jdbcTemplate_navi_w_0" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg> <ref bean="dataSource0_navi_w_0" /> </constructor-arg> </bean>

jta.properties(修改默认配置使用)

com.atomikos.icatch.serial_jta_transactions=false
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.enable_logging=false
com.atomikos.icatch.output_dir=./logs/atomikos_logs
com.atomikos.icatch.log_base_dir=./logs/atomikos_logs

测试,JdbcTemplate操作数据库

@Service
public class TestService {
    
    @Resource(name = "jtaTransactionManager")
    private JtaTransactionManager jtaTransactionManager;
    @Resource
    private TestRpcDao testRpcDao;
    @Resource
    private Test2RpcDao test2RpcDao;
    @Resource(name = "transactionTemplate")
    private TransactionTemplate transactionTemplate;  
    
    //编程式
    public void test1() {
        UserTransaction userTx = jtaTransactionManager.getUserTransaction();
        try {
            userTx.begin();
            
            int i = test2RpcDao.testCinfInsert();
            System.out.println("cinf:" + i);
            int j = testRpcDao.testNaviInsert();
            System.out.println("navi:" + j);
            
            int a = 1 / 0;
            userTx.commit();
        } catch (Exception e) {
            System.out.println("捕获到异常,进行回滚" + e.getMessage());
            e.printStackTrace();
            try {
                userTx.rollback();
            } catch (IllegalStateException e1) {
                System.out.println("IllegalStateException:" + e1.getMessage());
            } catch (SecurityException e1) {
                System.out.println("SecurityException:" + e1.getMessage());
            } catch (SystemException e1) {
                System.out.println("SystemException:" + e1.getMessage());
            }
        }
    }
    
    //声明式,不管用,网上方法:不去扫描Service层注解。尝试了一下,然后解决了这个分布式事务问题。可以去掉@Service试下

@Transactional(rollbackFor={Exception.class, RuntimeException.class})
public String test2(){
int i = test2RpcDao.testCinfInsert();
System.out.println(“cinf:” + i);
int j = testRpcDao.testNaviInsert();
System.out.println(“navi:” + j);
// int a=1/0;
return null;
}

//事务模板方式
public void test3() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
int i = test2RpcDao.testCinfInsert();
System.out.println(“cinf:” + i);
int j = testRpcDao.testNaviInsert();
System.out.println(“navi:” + j);
int a = 1 / 0;
} catch (Exception ex) {
// 通过调用 TransactionStatus 对象的 setRollbackOnly() 方法来回滚事务。
status.setRollbackOnly();
ex.printStackTrace();
}
}
});

/*
* //有返回值的回调 Object obj=transactionTemplate.execute(new
* TransactionCallback(){
*
* @Override public Object doInTransaction(TransactionStatus status) {
*
* return 1; } });
*/
}
}

 

atomikos 配置好后 @transactional 注解不生效的问题   https://blog.csdn.net/u011696259/article/details/71603480     

atomikos JTA/XA全局事务   http://www.tianshouzhi.com/api/tutorials/distributed_transaction/386

【分布式事务】使用atomikos+jta解决分布式事务问题  https://blog.csdn.net/kisscatforever/article/details/79129055

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167031.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 操作系统–银行家算法c语言代码

    操作系统–银行家算法c语言代码直接上代码了,两个文件分别是main.c和banker.hmain.c#include#include#include”banker.h”//试探分配voidProbeAlloc(intprocess,RESOURCE*res){Available.A-=res->A;Available.B-=res->B;

    2022年7月22日
  • Matlab符合矩阵微分,matlab解矩阵微分方程.pdf[通俗易懂]

    matlab解矩阵微分方程MATLAB20180625–MATLAB1Definition1t′()Definition2∫()∫24MATLABode451:–11–MATLAB⩾(1)2.14MATLAB1%RUNGEKUTTA442%hyowinn…

    2022年4月9日
  • 灵格斯:很好很强大的免费电子辞典「建议收藏」

    灵格斯:很好很强大的免费电子辞典「建议收藏」http://www.readfree.net/htm/200807/4624781.html 本文向大家推介近年来出现的国产免费电子辞典软件“灵格斯”(Lingoes),分为四个部分。首先是基本介绍,然后把它和几款同类软件进行了比较,接下来分享我在实用中发现的3个技巧,最后总结了有关的网址链接。本文以主观片面为原则,效果如何,请指教。1.介绍=============

    2022年7月15日
  • groupid和artifactid的区别是啥(中人是指哪些人)

    最近用Maven创建工程,一直搞不懂Maven中的GroupID和ArtifactID是什么,直到看了网上的一篇文章才明白,在此与大家分享分享 本文转载于一问网友的回答(略修改) 地址:https://zhidao.baidu.com/question/1639120287056394340.html    GroupId和ArtifactId被统称为“坐标”是为了保证项目唯一性而提出的…

    2022年4月16日
  • MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

    MYSQL 回表、索引覆盖、 索引下推[通俗易懂]1.索引种类创建数据表&插入数据createtableuser(idint(10)auto_increment,namevarchar(30),agetinyint(4),primarykey(id),indexidx_age(age)USINGBTREE)engine=innodbcharset=utf8mb4;insertintouser(name,age)values(‘张三’,30),

    2022年9月25日
  • JAVA日期格式化(Simpledateformat)

    Java日期格式化常用方法Java中Date类中的一些日期格式话方法都已过期,所以不推荐使用。一般格式化时,常用到这两个类:Calendar和SimpleDateFormat,使用方法如下:1.Calendar类Calendar类是abstract的,所以实例化方式得用静态方法:Calendarc=Calendar.getInstance();,此时的生成的实例依据的是当前系统时间;c.se…

    2022年4月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号