分布式事务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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java手机号正则表达式验证,面试必会「建议收藏」

    java手机号正则表达式验证,面试必会「建议收藏」什么是Arthas?Arthas是一款开源在线诊断工具,采用命令行交互模式,支持web端在线诊断,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。这是一款开源一年多GitHubstar2万,99%的阿里研发小哥都在用的Java终极诊断利器!相对比直接下载使用,我推荐开发者可以试一下通过IDE插件CloudToolkit中使用Arthas来实现一键远程诊断功能。得益于Arthas强大且丰富的功能,让Arthas能做的事情超乎想象。下面仅仅列举几

  • C++ 使用system()实现锁定屏幕「建议收藏」

    C++ 使用system()实现锁定屏幕「建议收藏」除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html此外,也可以使用函数“system()”来实现。IDE:Code::Blocks16.01操作系统:Windows7x641#include<windows.h>23intmain(…

  • phpstorm 2022.01.21激活【最新永久激活】[通俗易懂]

    (phpstorm 2022.01.21激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • DropDownList的常用属性和事件「建议收藏」

    DropDownList的常用属性和事件「建议收藏」SelectedItem属性设置或获取下拉菜单的选中项,该属性的类型为System.Web.UI.WebControls.ListItem.所有列表控件(ListControl)中的项都是该类型,它

  • 火狐破解收费hackbar「建议收藏」

    火狐破解收费hackbar「建议收藏」https://blog.csdn.net/qq_38963246/article/details/95489242

  • windows密码获取 — LC5暴力激活成功教程Hash密码「建议收藏」

    windows密码获取 — LC5暴力激活成功教程Hash密码「建议收藏」​错,可以改,那,错过呢。。。—-网易云热评一、首先用QuarksPwDump导出hash值并存储到1.txtquarkspwdump–dump-hash-local–output1.txt二、下载并安装LC5并注册1、下载地址:回复2、双击lc5setup一路下一步,3、将hashgen和lc5替换了原文件4、双击lc5,并打开注册机,点击administrator三、使用方法1、点击会话,导入1.txt…

发表回复

您的电子邮箱地址不会被公开。

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