分布式事务的简单理解

分布式事务

分布式事务的简单理解

  1. 单独的系统中,事务是本地事务。而在分布式系统中,一个业务的完成需要及多个系统,需要涉及多个数据源。比如订单系统,下订单这个业务需要涉及支付系统,库存系统,物流系统等,假如库存系统出现问题,事务回滚,那么其他子系统的事务也必须回滚,否则就会出现事务不一致,导致下订单操作出现错误。
  2. 多个数据源,就需要多个connection对象,不能出现某个connection进行了提交,而某个connection进行了回滚,必须保持一致性。而LCN会协调n个connection对象,对应n个事务,保证事务要么都提交,要么都回滚。

模拟场景

1.若存在事务发起方参与方A参与方B。调用关系图如下:

分布式事务的简单理解
那么正常执行业务的时序图为:
分布式事务的简单理解
若参与方B出现异常,那么他们的业务时序图为:
分布式事务的简单理解

2.若他们的调用关系是这样的情况:
分布式事务的简单理解

正常执行业务的时序图为:

分布式事务的简单理解

此时发生参与方B出现异常时他们的时序图为:

分布式事务的简单理解
TX-LCN由两大模块组成, TxClient、TxManager
TxManager作为分布式事务的控制方,事务发起方或者参与方都由TxClient端来控制。
核心步骤

1.创建事务组

在事务发起方(consumer)开始执行业务代码之前先调用TxManager创建事务组对象。

2.加入事务组

参与方(库存系统、物流系统等)在执行完业务方法以后,将该模块的事务信息通知给TxManager。

3.通知事务组

在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。

举例:我们在商城购买商品,下订单。下订单这一操作需要涉及支付、库存、物流等。下订单这一操作作为事务发起方,支付、库存、物流作为参与方。一开始先创建TxManager事务组,统一管理事务。订单系统执行业务,调用对应参与方模块,参与方开始执行自己的业务,将事务信息发送给TxManager事务组(参与方还未提交事务)。等到所有参与方执行完毕,事务发起方会通知TxManager事务组,进行事务的提交(参与方未发生异常)或者回滚(某个参与方发生异常)。

LCN模式原理

LCN模式是通过代理Connection的方式实现对本地事务的操作,然后再由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。

假操作:
A:ConnectionProxy
B:Connection
大概理解:物流、库存系统的connection(B)由LCN进行代理(A),A可以执行B中的方法,当本地事务(物流系统的事务、库存系统的事务)最后想提交或者回滚的时候,A会执行一个假的操作,本地事务并没有真正提交或者回滚,也就没有进行close,connection对象并未关闭。代理连接放在LCN连接池中,等到所有参与方执行完毕后,TxManger会从连接池获取连接,对事务进行统一操作,提交或者回滚。
LCN通过连接池,延长了connection的生命周期。本来connection生命周期是到本地事务执行完毕,但是现在必须等到所有事务执行完毕。
提交:通知物流系统,事务提交,然后connection执行close方法,关闭连接,通知库存系统,事务提交,然后connection执行close方法,关闭连接。

LCN 特点

1.该模式对代码的嵌入性低(耦合度低)。(本地事务不需要做改动,只需要加依赖注解),其他模式耦合度较高,本地事务代码改动多。
2.该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。
3.该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。(LCN起协调connection作用)
4.该模式缺陷在于代理的连接需要随事务发起方一起释放连接,增加了连接占用的时间。(因为延长了connection生命周期)