Seata AT模式与TCC模式对比,我们应该选择哪种分布式事务解决方案

简介: Seata AT模式与TCC模式对比,我们应该选择哪种分布式事务解决方案

前言

在前面的博客中,我们依次讲解了Seata AT模式的原理及使用方式,上一篇博客中我们讲解了如何在Spring Cloud中集成Seata TCC模式,那么就有一个疑问,我们在实际项目中,应该选择哪种分布式事务解决方案呢?

优缺点对比

AT模式 TCC模式
新手入门难度 容易 适中
业务侵入性
性能 一般
编码工作量 一般
是否支持复杂sql 不完全支持 支持

1.【新手入门难度】AT模式的代码编写方式和平时一样,只需要在TM入口加上@GlobalTransactional即可,开发人员按照正常逻辑编码完全没有问题;TCC模式的设计思路和AT模式完全不一样,TCC的一阶段和二阶段都是需要开发人员自行编码处理的,在业务处理上需要按照TCC的资源预留方式开发,学习成本上较AT模式要高上一个级别,所以在新手入门难度这一点上,AT模式更加容易;

2.【业务侵入性】AT模式是业务无侵入的,开发人员只需要关注业务SQL即可,二阶段的处理完全由Seata框架托管;TCC模式无论是一阶段还是二阶段,全部的TryConfirmCancel逻辑全部需要开发人员根据业务需求自行编码;所以在业务侵入性上,AT模式更好;

3.【性能】AT模式在一阶段处理完毕后,还会存在行锁,此时如果有其他事务需要操作被行锁锁住的记录时,会被阻塞,直至分布式事务结束才能拿到行锁;TCC模式因为是资源预留的设计方式,只有在一阶段预留资源时存在竞争,一阶段处理完毕后,不管分布式事务是否结束,后续都不存在资源竞争问题,所以TCC模式相较于AT模式,性能是更好的;

4.【编码工作量】AT模式只关注业务SQL,TCC模式需要根据业务设计来实现资源预留方案,二阶段提交和回滚逻辑全部需要开发人员编码实现,所以编码工作量上几乎是AT模式的2~3倍;

5.【是否支持复杂sql】AT模式需要针对提交的业务SQL进行拦截,并进行解析,根据对应的业务SQL生成前后镜像,这也就意味着AT模式并不能支持很复杂的业务SQL;TCC模式不用关心具体的业务SQL,Seata只会根据开发人员编码分别调用TryConfirmCancel方法,所以在这一点上,TCC模式更胜一筹;

该如何选择

根据上述AT模式与TCC模式的对比,我们可以了解到,如果业务功能对性能要求很高,并且属于公司的核心业务,那么建议采用TCC模式;如果该功能对性能要求一般,建议采用AT模式;有一点需要提醒的是,AT模式和TCC模式是可以在一个项目中共存的,所以小伙伴们完全可以根据具体的业务需求选择任意的分布式事务解决方案;感兴趣的小伙伴还可以上github下载我准备好的相关案例:awesome-seata


相关文章
|
11天前
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
11天前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
22天前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
11天前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
11天前
常用的分布式事务解决方案(二)
常用的分布式事务解决方案(二)
|
2月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
2月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
55 2
|
2月前
|
存储 监控 数据可视化
性能监控之JMeter分布式压测轻量日志解决方案
【8月更文挑战第11天】性能监控之JMeter分布式压测轻量日志解决方案
61 0
性能监控之JMeter分布式压测轻量日志解决方案
|
2月前
|
Java 关系型数据库 MySQL
(二十七)舞动手指速写一个Seata-XA框架解决棘手的分布式事务问题
相信大家对于事务问题都不陌生,在之前《MySQL事务篇》中曾详解过MySQL的事务机制,在传统的单库环境下开发,咱们可依赖于MySQL所提供的事务机制,来确保单个事务内的一组操作,要么全部执行成功,要么全部执行失败。
|
2月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
68 0
下一篇
无影云桌面