分布式事务,怎么感觉不需要那么复杂

70 天前
 bleulucaswu

最近了解了一下 saga, Orchestration-based sagas 这些设计,貌似看起来非常的复杂,但是我觉得分布式事务的问题很好解决才对

为啥我这样想,觉得分布式事务也不是啥复杂的东西呢。

2753 次点击
所在节点    Java
23 条回复
lovelylain
70 天前
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability ),你觉得按你的实现,还能叫事务吗?
v2defe
70 天前
acid 的 i 没解决
bleulucaswu
70 天前
@v2defe 可以给 modify 中的数据加个 flag, 在 submit 之前是不可视。
546L5LiK6ZOt
70 天前
像楼主说的场景,如果只是考虑两个异构存储的数据一致性,直接用 DTS 就好了,更简单。
NeroKamin
70 天前
不就跟 2pc 差不多吗
bleulucaswu
70 天前
@546L5LiK6ZOt 那 Saga 这种啥情况会用呢,有相关的成熟的技术吗
oneisall8955
70 天前
你考虑的只是插入,更新呢,涉及 N 个微服务呢?
thinkershare
70 天前
分布式事务是个 CAP 不可能三角,Saga 要解决的问题问题是一个分布式的事务处理是一个状态机,存在很多中间状态转换。你要保证所有状态的最终一致性,负责状态的补偿本身就是很复杂的,这个逻辑需要一个容纳的位置,放在各个子服务中是不合适的,因此使用 Saga 模式来管理整个状态转换过程。
potatowish
70 天前
如果回退也失败了呢,怎么保证一致性
az467
70 天前
确实不复杂。

因为不管你怎么设计,
要么不正确,要么本质上是 2pc 的变种。
rekulas
70 天前
多年的开发经验早告诉我,如果我觉得一件工作整个行业都设计的太过复杂,那一定是我自己还没能理解复杂性在哪里
yidinghe
70 天前
@rekulas 直到我看到一篇新闻说 Oracle 员工爆料自家数据库的代码就是屎山
me1onsoda
70 天前
真的有人用分布式事务吗?本来为了提高性能分了库,分布式事务性能一笔吊糟,整个系统复杂度直线上升
notwaste
70 天前
OP 的这个思路属于 TCC 吧,需要多做回退操作,但是其实本质上也属于 2PC ,分布式事务其实是个泛化伪命题,就好像多线程事务一样,跨进程不就破坏了隔离性吗
crackhopper
70 天前
我反正也是个分布式方面的外行,就随便说点自己想到的复杂性:
需要有除了操作以外的日志记录步骤,这样回退出问题可以检测到,并重新回退。然后加了这个步骤就成了 2pc 。
还有其他复杂的地方,比如每个 api 要保证幂等,api 之间的依赖。。。回滚过程中和其他事件的互斥,以及业务上怎么更好处理互斥,互斥带来的性能问题。然后就复杂了呗。本身锁的实现可能不复杂,怎么用锁才是复杂的根源。
bleulucaswu
70 天前
@potatowish 回退失败这种事 只能用重试解决吧 或者增加 instance 数量 保证出问题的概率小店 我感觉难的就隔离性麻烦点
luoqeng
70 天前
异步通信分布式没法判断失败,你不知道是进程被挂起,还是网络延迟了,或者执行成功返回成功的消息丢失。
happyxhw101
70 天前
c 请求 a, b -> 因为网络阻塞触发超时 -> 失败回滚 -> 回滚成功 -> 网络阻塞解除,初始的请求执行成功

所以有一种是基于 “可靠消息+本地消息表“ 的分布式事务解决方案
luoqeng
69 天前
rekulas
69 天前
@yidinghe 这是两回事,哪怕你花几十亿重构一个新版本也会非常复杂,20 年后又是一坨新的山

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1019248

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX