大部分人没有使用过 SAGA。我这里给出我曾经使用过一个实现比较复杂但是理论很简单的 SAGA 调度机制,你可以用来刷亮点,关键词是并发调度
早期我设计过一个比较复杂的 SAGA 机制,它支持并发调度。也就是说如果整个分布式事务中有可以并发执行的步骤,那么就并发执行,在后续出错的时候,这些并发执行的步骤也可以并发反向补偿。
SAGA 本身也是需要考虑容错的,难点就是在反向补偿的时候失败了怎么办?比如说在前面的例子里,你准备删除数据的时候失败了。那么还是没有特别好的办法,无非就是不断重试,这一部分你可以参考 TCC 中讨论的容错内容。
在讲完容错之后,紧接着你可以尝试把话题引导到 AT。
我个人认为最近比较流行的 AT 模式可以看作是 SAGA 的一种特殊形态,或者说简化形态。
#
AT 是指如果你操作很多个数据库,那么分布式事务中间件会帮你生成这些数据库操作的反向操作。
这就有点类似于 undo log。比如说你数据库操作是一个 INSERT,那么对应的反向补偿操作就是 DELETE 了。你在回答的时候就可以结合 undo log 一起回答,顺便把话题引导到 undo log 上。
AT 模式的核心是分布式事务中间件会帮你生成数据库的反向操作,比如说 INSERT 对应的就是 DELETE,UPDATE 对应的就是 UPDATE,DELETE 对应的就是 INSERT。这个机制有点类似于 undo log。
同样地,AT 事务也有容错的问题,它的容错和 SAGA 一样,都是在反向补偿的时候出错了该怎么办。这里我就不赘述了,你可以参考前面的内容。
在回答了这些内容之后,你还可以进一步强调可以考虑禁用跨库事务。
如果是单纯使用分库分表,不涉及多个服务的分布式事务,可以考虑直接禁用跨库事务,一了百了。