分布式事务LCN和seata对比

本文详细介绍了LCN和Seata两种分布式事务处理框架的实现原理。LCN通过长连接和假关闭来管理事务,而Seata利用undo_log记录操作,通过回滚SQL实现事务管理。两者在回滚方式上存在差异,LCN可能引发死锁,而Seata能避免死锁但可能有脏读风险。此外,Seata缺少管理页面,而LCN配置较为简单。

一、LCN实现原理
1.发起方与参与方都与我们的LCN管理器一直保持长连接;
2.发起方在调用接口之前,先向LCN管理器申请一个全局的事务分组id;
3.发起方调用接口的时候在请求头中传递事务分组id;
4.参与方获取到请求头中有事务分组的id的,则当前业务逻辑执行完实现假关闭,不会提交或者回滚当前的事务。
5.发起方调用完接口后,如果出现异常的情况下,在通知给事务协调者回滚事务,这时候事务协调则告诉给参与方回滚当前的事务。
 

二、Seata实现原理
1.TM(发起方)连接到我们的TC事务协调者,创建一个全局的事务的xid,保存到ThreadLoacl中;
2.TM(发起方)和RM(参与方)都被Seata的数据数据源实现代理,在原生的sql之前和之后保存原来和修改后日志到undo_log中,方便后期实现回滚。
3.TM(发起方)使feign客户端调用接口时候,在ThreadLoacl中获取xid,设置到请求头中;
4.RM(参与方)从请求中获取到该xid,设置到ThreadLoacl中,同时也会向seataserver注册该分支事务。
5.TM(发起方)将当前本地事务的结果,告诉给协调者TC,协调者TC在通知所有的分支是否回滚。
6. TM(发起方)如果调用接口成功之后抛出异常的情况下,告诉给协调者TC,协调者TC在通知所有的分支根据根据全局的xid和分支事务的id 查询分支数据源的undo_log日志表逆向生成sql语句实现回滚,同时删除对应的undo_log日志
7. TM(发起方)如果调用接口成功之后没有抛出任何的异常,告诉给协调者TC,协调者TC在通知所有的分支根据根据全局的xid和分支事务的id 查询分支数据源的 删除对应的undo_log日志表

Seata原理分析
1.发起方TM会向我们的TC协调者申请一个全局的事务id,保存到threadlocal中;
2.TM和RM都会被Seata代理数据源,写入原来和修改后内容保存到undo_log表中;
3.TM从请求头中传递该全局的事务id给RM,RM从请求中头中获取到该全局事务id,并且注册该分支。
4.如果TM调用接口成功之后,如果报错的情况下则通知给协调者,协调者在告诉所有的分支都开始回滚,直接根据本地事务id+xid查询undo_log表 ,逆向生成sql语句回滚,同时删除该undo_log日志。
5.如果TM调用接口成功之后,如果没有报错的情况下则通知给协调者,协调者在告诉所有的分支都开始提交事务,直接根据本地事务id+xid删除对应的undo_log表记录即可。

undo_log表每个数据库都要

前置镜像 select * from order state = 0 原来的值
Update order set state(1) where userID=1 订单服务实现 1
后置镜像 1 之后的值
逆向的话 Update order set state(0) where userID=1

要注册到nacos上实现高可用
 

三、Seata与Lcn的区别

1、seata没有管理页面

2、LCN配置简单易上手

3、基本实现的思路差不多,唯一区别在于回滚的方式 LCN采用代理数据源假关闭连接,暂时不提交本地事务,但是容易造成数据的死锁。
4、Seata采用undo_log的形式逆向生成sql语句实现回滚,避免死锁现象但是容易出现脏读。

<think>嗯,用户之前问了Java开源的SaaS系统框架,现在又转向了分布式事务选型中的Seata。这说明他可能正在构建一个分布式系统,尤其是基于微服务架构的SaaS应用,需要处理跨服务的事务问题。 首先,用户可能对Seata的基本概念核心功能不太清楚,需要先解释Seata是什么,以及它解决了什么问题。接着,用户可能想了解Seata的架构核心模式,比如AT、TCC、SagaXA模式的区别应用场景。这部分需要详细说明每种模式的优缺点,帮助用户根据实际需求选择合适的模式。 然后,用户可能关心如何在实际项目中集成Seata,包括依赖配置、数据源代理、事务管理器的配置等。这部分需要给出具体的代码示例,让用户能够快速上手。此外,用户可能还想知道Seata的高可用部署方案,比如如何结合Nacos数据库进行集群配置,确保系统的稳定性可靠性。 用户还可能对Seata的适用场景局限性感兴趣,比如在高并发或长事务环境中的表现,以及与其他分布式事务方案的对比。这时候需要结合实际情况,给出选型建议,帮助用户判断是否适合他们的项目需求。 另外,用户之前的提问涉及SaaS系统,可能特别关注多租户环境下的事务处理,需要确认Seata是否支持或在这样的场景中有什么最佳实践。虽然Seata本身不直接处理多租户,但可以结合业务逻辑数据隔离策略来实现,这部分可能需要进一步说明。 最后,提供官方资源社区支持信息,方便用户深入学习解决问题。用户可能需要实际案例或文档链接来参考,所以给出GitHub地址官方文档链接会很有帮助。 总结来说,回答需要结构清晰,覆盖Seata的核心概念、使用方式、部署方案、适用场景及与其他方案的对比,同时结合用户之前的SaaS背景,给出相关建议,确保信息全面且实用。</think>以下是关于分布式事务框架 **Seata** 的深度解析与选型指南,包含架构原理、核心模式对比及实战建议: --- ### 一、Seata核心架构 #### 1. **核心组件** - **TC (Transaction Coordinator)** 事务协调器,全局事务调度中心(需独立部署) - **TM (Transaction Manager)** 事务发起方,定义全局事务边界(标注@GlobalTransactional) - **RM (Resource Manager)** 本地资源管理器,负责分支事务注册与状态上报 #### 2. **工作流程** ``` [TM] -- 开启全局事务 --> [TC] ↓ [RM] -- 注册分支事务 --> [TC] ↓ [TM] -- 提交/回滚 --> [TC] ↓ [TC] -- 通知各分支 --> [RM] ``` --- ### 二、事务模式对比 | 模式 | 原理 | 适用场景 | 性能损耗 | 侵入性 | |-------|------------------------|-----------------------|------|-------| | **AT** | 自动补偿(生成逆向SQL) | 常规业务(非跨语言) | 低 | 低 | | **TCC** | Try-Confirm-Cancel 手写 | 高一致性要求(如资金交易) | 中高 | 高 | | **Saga** | 状态机编排 | 长事务/跨服务复杂流程 | 低 | 中 | | **XA** | 两阶段提交协议 | 强一致数据库(如Oracle) | 高 | 依赖数据库 | #### 重点说明: - **AT模式** 通过`UNDO_LOG`表实现数据快照(需在业务库中创建),执行流程: ```sql -- 业务操作 UPDATE product SET stock = stock - 1 WHERE id = 1001; -- 自动记录undo log INSERT INTO undo_log VALUES (..., '{"before":{"stock":10}}'); ``` - **TCC模式** 需手动实现三个接口(以库存服务为例): ```java // Try阶段 boolean deductStockTry(String bizId, int count); // Confirm阶段 boolean deductStockConfirm(String bizId); // Cancel阶段 boolean deductStockCancel(String bizId); ``` --- ### 三、生产级配置建议 #### 1. **高可用部署** ```yaml # TC Server配置(使用Nacos注册中心) seata: registry: type: nacos nacos: server-addr: 127.0.0.1:8848 config: type: nacos store: mode: db db: datasource: druid url: jdbc:mysql://127.0.0.1:3306/seata?useSSL=false user: root password: 123456 ``` #### 2. **性能优化项** - 调整TC的`server.session.batchSize`(批量处理消息数) - 启用`seata.client.rm.report.retry.count=5`(RM上报重试) - 使用Redis替代文件存储Session(需扩展`SessionStore`接口) --- ### 四、选型决策树 ``` 是否需要强一致性? ├─ 是 → 优先XA模式(需数据库支持) └─ 否 → ├─ 是否有跨语言需求? → 是 → Saga模式 ├─ 是否接受代码侵入? → 否 → AT模式 └─ 业务需自定义补偿 → TCC模式 ``` --- ### 五、典型问题解决方案 1. **脏数据回滚失败** - 现象:AT模式UNDO_LOG与当前数据不一致 - 处理:实现`AbstractUndoLogManager`自定义冲突检测 2. **TC单点故障** - 方案:部署TC集群 + 数据库高可用(推荐MySQL Group Replication) 3. **跨命名空间隔离** - 配置`seata.tx-service-group=prod_tx_group`实现环境隔离 --- ### 六、监控集成 ```java // 接入Prometheus监控 @Configuration public class SeataMetricsConfig { @Bean public MeterRegistryPrometheusConfigurer prometheusConfigurer() { return registry -> registry.config().commonTags("application", "order-service"); } } ``` 监控指标示例: - `seata.transaction.active.count`(活跃事务数) - `seata.transaction.commit.rate`(提交成功率) --- ### 七、与同类方案对比 | 框架 | 协议 | 跨语言支持 | 运维复杂度 | 社区活跃度 | |----------|---------|-------|-------|-------| | **Seata** | 自定义协议 | 部分 | 中 | ⭐⭐⭐⭐ | | **LCN** | XA衍生 | 否 | 高 | ⭐⭐ | | **RocketMQ事务消息** | 最终一致 | 是 | 低 | ⭐⭐⭐ | --- **推荐场景**: - 基于Spring Cloud/Dubbo的Java技术栈 - 需灵活切换事务模式的混合业务 - 已有MySQL作为基础数据库的环境 官方文档:<https://seata.io/zh-cn/> GitHub:<https://github.com/seata/seata>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值