分布式事务三--AT模式 - zpk-aaron - 博客园
•
RocketMQ
消息中间件解决分布式事务。
•
消息中间件需要保证消息可靠性,消息幂等性,唯一性。处理失败需要主动些补偿机制,容易出错。
•
本地消息表
(
异步确保
)
•
本地消息表是国外的
ebay
搞出来的一套
方案。
•
基于
XA
的两阶段提交方案
•
XA
它包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如
Oracle
、
DB2
这些商业数据库都实现了
XA
接口,而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚
。两
阶段提交方案应用非常广泛,几乎所有商业
OLTP (On-Line Transaction Processing)
数据库都支持
XA
协议。但是两阶段提交方案开发复杂、锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。
•
TCC
解决方案
•
TCC
方案在电商、金融领域落地较多。
TCC
方案其实是两阶段提交的一种改进。其将整个业务逻辑的每个分支显式的分成了
Try
、
Confirm
、
Cancel
三个操作。
seata
•
(
1
)
AT
•
在
AT
模式下,用户只需关心自己的 “业务
SQL”AT
模式分为两个阶段:一阶段:执行用户
SQL
二阶段:
Seata
框架自动生成
•
优点:
AT
模式的一阶段、二阶段提交和回滚均由
Seata
框架自动生成,用户只需编写“业务
SQL”
,便能轻松接入分布式事务,
AT
模式是一种对业务无任何侵入的分布式事务解决方案。
•
(
2
)
TCC
•
TCC
分为三个阶段:
Try
:做业务检查和资源预留,
Confirm
:确认提交,
Cancel
:业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放
•
优点:
相对于
AT
模式,
TCC
模式对业务代码有一定的侵入性,但是
TCC
模式无
AT
模式的全局行锁,
TCC
性能会比
AT
模式高很多。
•
(
3
)
Sage
•
Sage
是长事务解决方案,事务驱动,
•
优点:
一阶段提交本地数据库事务,无锁,高薪能,补偿服务即正向服务的 “反向”,高吞吐,参与者可异步执行,高吞吐
•
(
4
)
XA
•
XA
模式是
Seata
将会开源的另一种无侵入的分布式事务解决方案
•
优点:
无侵入,将快照数据和行锁等通过
XA
指令委托给了数据库来完成
•
Seata
分为两部分,
seata
-server
和
seata
-client
。
•
seata
-server
•
seata
-server
目前稳定版本最新版为
1.3.0
版本,
1.3.0
版本在运行过程中发现一些问题,
seata
开发的小伙伴已经对部分进行修复,升级包为
1.4.0-
SNAPSHOT
。
•
seata
-client
•
Client
即为我们的业务服务,业务服务在启动的时候会主动连接
seata
-server
服务器。在使用使用时,保证和
server
版本一致。
•
AT
模式
•
因为
AT
模式是一种
0
侵入式的,只需要一个注解即可解决问题,使用方便。
•
AT
模式的部署不仅需要搭建
seata
-server
服务器,还需要在
seata
-client
端设置数据源代理,并在业务数据库创建
undo_log
表记录数据回滚信息。
•
在
seata
官网,也有相关部署以及所需要的
sql
。
•
Seata
官网:
seata.io
•
seata
-client
集成首先在
pom
中引入
jar
包
•
<!--
seata
-
->
< dependency >
< groupId > com.alibaba.cloud </ groupId >
< artifactId >spring-cloud- alibaba - seata </ artifactId >
< exclusions >
< exclusion >
< groupId > io.seata </ groupId >
< artifactId > seata -spring-boot-starter</ artifactId >
</ exclusion >
</ exclusions >
< version >2.2.0.RELEASE</ version >
</ dependency >
< dependency >
< groupId > io.seata </ groupId >
< artifactId > seata -spring-boot-starter</ artifactId >
< version >1.3.0</ version >
</ dependency >
< dependency >
< groupId > com.alibaba.cloud </ groupId >
< artifactId >spring-cloud- alibaba - seata </ artifactId >
< exclusions >
< exclusion >
< groupId > io.seata </ groupId >
< artifactId > seata -spring-boot-starter</ artifactId >
</ exclusion >
</ exclusions >
< version >2.2.0.RELEASE</ version >
</ dependency >
< dependency >
< groupId > io.seata </ groupId >
< artifactId > seata -spring-boot-starter</ artifactId >
< version >1.3.0</ version >
</ dependency >
•
不
建议仅
引入
seata-all
,需要自行实现的东西太多。
•
spring
-
cloud
-alibaba-
seata
,
2.1.0
内嵌
seata-all
0.7.1
,
•
2.1.1
内嵌
seata-all
0.9.0
,
2.
2
.
0
内
嵌
seata-all
1
.
1
.0
。
•
建议
排除掉,
引入
seata
-spring-boot-starter
;
•
spring-cloud-
alibaba
-
seata
中会引入
spring-cloud-starter-
openfeign
此实现
XID
在服务间传递。
•
Seata
代理数据源
•
自动装配的相关设置
——
均已
1.1.0
版本为
例
,
开启
与关闭
•
对于使用
seata
-spring-boot-starter
的方式,默认已开启数据源自动代理
,
如需关闭,
请配置
seata.enableAutoDataSourceProxy
=false
,该项配置默认为
true
。如
需切换代理实现方式,请通过
seata.useJdkProxy
=false
进行配置
,
默认为
false
,采用
CGLIB
作为数据源自动代理的实现方式。
•
对于使用
seata
-all
的方式,请使用
@
EnableAutoDataSourceProxy
来显式开启数据源自动代理功能。如有需要,可通过该注解的
useJdkProxy
属性进行代理实现
方式的
切换。默认为
false,
采用
CGLIB
作为数据源自动代理的实现方式。
•
其他版本设置
1.0.0: client.support.spring.datasource.autoproxy =true
0.9.0: support.spring.datasource.autoproxy =true
1.0.0: client.support.spring.datasource.autoproxy =true
0.9.0: support.spring.datasource.autoproxy =true
•
Seata
注解使用
•
@
GlobalTransactional
例如:
•
•
TCC
分为三个阶段:
Try
:做业务检查和资源预留,
Confirm
:确认提交,
Cancel
:业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放
•
Tcc
模式也需要
通过
GlobalTransactional
注解开启
事务,并
调用各个服务提供方的
try()
方法。
•
服务提供方
•
TwoPhaseBusinessAction
注解标记这是个
TCC
接口,同时指定
commitMethod
,
rollbackMethod
的名称
•
BusinessActionContext
是
TCC
事务中的上下文对象
•
BusinessActionContextParameter
注解标记的参数会在上下文中传播,即能通过
BusinessActionContext
对象在
commit
方法及
cancle
方法中取到该参数值
•
Saga
模式
•
Saga
模式是
SEATA
提供的长事务解决方案,在
Saga
模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现
。
•
XA
模式
•
XA
模式是
Seata
将会开源的另一种无侵入的分布式事务解决
方案。
•
优点:
无侵入,将
快照数据和行锁等通过
XA
指令委托给了数据库来
完成。
•
缺点:
性能
低。