关于JTA事务和XA事务的介绍
何为分布式事务
一个事务包含多个操作,多个操作操作了多个数据源,这样的事务称为分布式事务。
案例
为什么不能简单的借助数据源的本地事务
用数据源本地事务代码案例
Con1 = db1.getConn..;
Con2 = db2.getConn..;
Try{
con1.insert….
con2.update….
con1.commit;
con2.commit;
}catche(Exception e){
con1.rollback;
con2.rollback;
}
现在会出现一个问题,就是会有第一个事务提交了但是第二个事务失败了,就保证不了一致性了。所以引入了事务管理器
分布式事务管理需要做什么
协调各个数据源的提交、回滚、以及应对通信异常的的管理机制
数据源本身需要支持这种机制(Innodb引擎是支持的)
应对应用的故障恢复机制
事务管理器是协调数据源的,所以需要一套规范的协议
应对网络、主机故障等 事务管理器和数据源需要记录相关日志
就产生了2套规范 :XA 规范和JTA
何为XA 规范
是一套跨语言的标准
XA事务的处理模型
XA的流程
3.XA的2阶段提交 2PC
JTA 是什么
Java Transaction API
java根据XA规范提供的事务处理标准
目的:统一一个API 简化学习
javax.transaction
javax.transaction-api
1.3
定义了一套的接口
开源的实现 TM 提供商
Java Open Transaction Manager (JOTM)
JBoss TS
Bitronix Transaction Manager (BTM)
Atomikos
Narayana
RM的提供商
Spring集成JTA(Atomikos案例)
maven依赖
单纯使用Spring
javax.transaction
javax.transaction-api
1.3
com.atomikos
transactions-jdbc
4.0.6
com.atomikos
transactions-jms
4.0.6
Spring boot
org.springframework.boot
spring-boot-starter-jta-atomikos
2.1.1.RELEASE
bean的配置
init-method="init" destroy-method="close">
value="com.alibaba.druid.pool.xa.DruidXADataSource" />
${db1.jdbc.url}
${jdbc.username}
${jdbc.password}
1
1
10
init-method="init" destroy-method="close">
value="com.alibaba.druid.pool.xa.DruidXADataSource" />
${db2.jdbc.url}
${jdbc.username}
${jdbc.password}
1
1
10
class="com.atomikos.icatch.config.UserTransactionServiceImp"
init-method="init" destroy-method="shutdownForce">
com.atomikos.icatch.standalone.UserTransactionServiceFactory
jtalog
f:/test
class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close"
depends-on="userTransactionService">
class="com.atomikos.icatch.jta.UserTransactionImp"
depends-on="userTransactionService">
class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="userTransactionService">