117.如何解决分布式事务?

目前市面上,分布式事务的解决方案还是蛮多的,但是都是基于一个前提,需要保证本地事务。那么,就对我们在分库分表时,就有相应的要求:数据在分库分表时,需要保证一个逻辑中,能够形成本地事务。举个例子,创建订单时,我们会插入订单表和订单明细表,那么:

  • 如果我们基于这两个表的 id 进行分库分表,将会导致插入的记录被分到不同的库表中,因为创建下单可以购买 n 个商品,那么就会有 1 条订单记录和 n 条 订单明细记录。而这 n 条订单明细记录无法和 1 条订单记录分到一个库表中。

  • 如果我们基于这两个表的 user_id 进行分库分表,那么插入的记录被分到相同的库表中。

    这也是为什么业务表一般使用 user_id 进行分库分表的原因之一。

可能会有胖友有疑问,为什么一定要形成本地事务?在有了本地事务的基础上,通过使用分布式事务的解决方案,协调多个本地事务,形成最终一致性。另外,? 本地事务在这个过程中,能够保证万一执行失败,再重试时,不会产生脏数据。