分布式事务LCN原理

Posted 猿之村

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务LCN原理相关的知识,希望对你有一定的参考价值。

前言

如果有懂lcn的,想直接看代码实现传送门:[springcloud分布式事务实现](https://yuanzhicun.blog.csdn.net/article/details/114120441)

提示:以下是本篇文章正文内容,下面案例可供参考

一、LCN是什么?

LCN分布式事务系统通过代理数据资源,通过TxManager(事务管理器)协调来完成对事务的统⼀控制,这样的操控⽅式使得框架对业务嵌⼊性⾮常低在对本地代理资源的同时也通过排它锁防⽌其他⼈的访问,从⽽也保障了事务的隔离性。

二、LCN 代理事务的协调原理

TC:Transaction Client 代表事务客户端,对应流程中 是对事务发起⽅与事务参与⽅的泛指。TM:TransactionManager,也简称为TxManager是事 务管理器。

1.上图是对分布式事务的协调控制流程图

步骤介绍: 步骤1: 事务发起⽅在开始执⾏业务之前将先调⽤TM通知创建事务,事务中包含关键的事务信息如节点信 息、全局事务Id标示等信息,发起⽅将等待TM响应数据以后再执⾏步骤2。 步骤2: 当接受到TM创建的事务消息以后,事务发起⽅则开始执⾏⾃⼰的业务代码,在执⾏业务的过程就会开始对各个参与⽅的调⽤,在调⽤时会将TM创建的事务标示信息传递到参与⽅中。 步骤3: 事务发起⽅开始发起对事务参与⽅的调⽤,调⽤时将会把事务标志信息传递给参与⽅。 步骤4: 当参与⽅接受到来⾃发起⽅的请求之后就开始执⾏本地的业务。在这⾥执⾏完业务后不会⽴即对本次的本地事务做处理,实际上在系统中是代理了连接对象没有对其做真正的事务操作。 步骤5: 当参与⽅A完成了本地业务的执⾏以后,再请求TM加⼊到本次事务中,提交的主要信息有本地的⽇志记信息与节点信息,在请求TM前会先开启超时等待任务,然后再发起加⼊事务指令给TM,加⼊事务受系统控制。 步骤6、7、8: 该步骤原理对账3、4、5⼀样,只是参与⽅不同⽽已。 步骤9: 当发起⽅完成所有的参与⽅调⽤以后,则根据最终的事务情况来通知TM提交事务,该步骤需要确认TM接受到消息,提交事务分为:commit、rollback两种,当提交完成事务以后也会与参与⽅⼀样开始进⼊等待超时机制。TM通知的流程是会遍历参与⽅逐步通知确认,全部通过后再通知发起⽅ 步骤10: TM通知参与⽅节点做事务的commit或rollback操作,对于TM通知成功的原则是需要将消息通知到参与⽅,参与⽅完成事务的执⾏后再将消息反馈给TM,TM接受到消息以后再开始调⽤下⼀个参与⽅的事务通知。这⾥存在超时机制与重试机制和切换模块事务机制,详细介绍可参考下⾯的内容。步骤11: 该步骤原理同步骤10⼀样,只是参与⽅不同⽽已。 步骤12: 通知发起⽅事务,该步骤是TM已经完成了对所有参与⽅的通知确认后,再通知发起⽅提交事务的操作步骤,发起⽅根据事务状态完成对事务的操作。 步骤13: 当发起⽅完成了事务操作则会通知TM事务已提交完成,这时候对于TM来说才是所有事务的完成,该消息⽆需TM有⽆接受到,都将在发送完成以后响应数据给调⽤者。由于事务已提交TM再次发起请求,也会由于SQL⽇志已清理⽽⽆法重复提交。

2.LCN组件介绍

TransactionClient(TC): 主要是对资源做代理控制锁定以及配合 TxManager对事务做提交回滚。TxManager(TM): 事务协调管理器,简写TM有时候也称作为 TransactionManager,是负责控制整个事务保存⼀致性的控制节点,也记录事务中可能出现的特殊情况与各阶段的操作⽇志数据⽤于调试追溯。

三、 TC代理控制处理的流程图

分布式事务LCN原理步骤介绍: 业务⽅法(开始事务) 开始事务是指参与⽅或者发起⽅开始执⾏⾃⼰的业务时开启事务操作,对应JDBC来说就需要去获取Connection连接对象,在这⼀步是将会开始访问JDBC接⼝获取连接对象。 JDBC操作(获取连接) 这⾥代表的是通过JDBC协议向连接池获取Connection连接对象的请求。 LCN代理连接池(获取连接) 这⾥是指通过LCN代理连接池继续将请求传递,向数据库连接池层获取Connection连接对象。 数据库连接池(获取连接) 这⾥是数据库连接池继续向数据库层获取连接请求传递。 LCN代理连接池(代理连接) 代理连接是指LCN将返回的连接对象创建代理对象,然后在返回给调⽤⽅。代理对象主要是为了获取 到实际要执⾏的业务操作和控制数据的“伪提交”代理控制⽅,这⾥是⼀个抽象的接⼝,⽬前代表的是关系 型数据库的代理实现。 业务⽅法(执⾏业务)   业务⽅法在执⾏业务的时候会对资源做操作,当操作资源的时候就会发送数据给LCN代理的对象。 业务⽅法(业务操作) 随着业务的操作,则将控制数据传递给了LCN代理连接池。LCN代理连接池(解析执⾏的SQL并保存起来) LCN接受到了业务⽅法的操作然后对其做业务解析操作,这⾥由于是关系型数据库,解析得到将是SQL语句。对SQL有两点主要事项:1、所有的赋值对象将通过java来赋值⽽不能直接使⽤数据库函数,就如mysql的now()函数⼀样,那么再对其做补偿业务的 情况下时,会出现记录的时间会与实际发⽣时间不⼀致的情况,就违背了幂等性;2、若是insert语句且是数据库主键⾃增类型的得需要获取到插⼊以后的主键key信息。 业务⽅法(提交事务) 业务⽅法完成了所有的业务操作,开始发起提交本地的事务提交请求。LCN代理连接池(事务伪提交,开始超时机制) LCN代理连接对象接受到提交事务请求时会阻⽌事务的提交,但是会将解析到的业务操作⽇志数据(SQL)存储到本地,再开始启⽤倒计时等待TM的消息通知,然后再返回提交成功给业务⽅法。 LCN代理连接池(响应提交)   LCN代理连接池将响应完提交事务以后将结果反馈给参与业务⽅,业务⽅法再继续执⾏业务,将数据 反馈给调⽤者。TxManager(通知事务) 当接受到TM的事务通知时,则会根据事务状态做对应的事务操作。 LCN代理连接池(提交事务) 当事务提交操作时,TC则会先创建对本次操作⽇志步骤的删除操作,对应关系型数据库来说就是对记录 的业务SQL做删除操作,将该操作步骤也加⼊到待提交的本地事务中,然后⼀同与本地事务提交。当接受到的是回滚操作,那么则会将删除操作加⼊到事务中然后⼀同回滚,这样的⽅式主要是为了在事务的回滚或提交时都会将删除⽇志操作与本地事务⼀起处理。注意:在执⾏delete语句的时候会根据实际记录的⽇志数来判断是否执⾏成功,若没有执⾏成功则肯定是由于⽇志数据没有保存成功导致的影响⾏数不匹配,此时会继续保存⽇志,若2次尝试后依旧⽆法保存则直接抛出JDBC异常。当事务正在提交或回滚后也不会出现重复提交的问题,因为重复提交的执⾏⽇志已经在事务提交是清理了,仅当需要补偿的时候才会保留本地的业务⽇志数据。当执⾏提交事务出现异常的时候也会重试,若重试依旧⽆法提交事务则直接作为补偿情况,此时将返回给TM事务须补偿的状态,也将取消对本地的超时任务。 LCN代理连接池(响应事务) 当LCN事务提交以后就开始响应事务通知给TM,通知TM本次事务已经完成。 LCN代理连接池(询问事务组) 若TM⻓时间没有请求到LCN代理连接池的话,那么LCN代理连接池将会触发超时请求机制,则会主动 去联系TM,若访问不到TM,则会再重试访问⼀次请求,若还不能访问则会根据TM的集群部署特点,请求其他的TM节点,若全都访问不到,只可能是TM故障或者⽹络故障,这样的情况下LCN代理连接将执⾏回滚事务,但是不删除⽇志数据。当再次联系上TM时可检测⽇志数据请求状态再做事务提交或回滚请求。若可以联系上TM则TM会响应⼀个继续等待的消息,则TC将继续等待TM通知。因此设置TC的等待超时时间可以是短暂的,因为在询问到TM若未完成的事务或者没有通知到的事务时TM都将通知TC继续等待。当TC请求到的TM状态已经是补偿状态时,则会唤醒TM的继续请求指令,然后TC将继续进⼊计时等待状态。 LCN代理连接池(事务回滚,释放资源,开始计时) 在本体事务提交的时候,会先通过TM获取到数据排他性的全局锁,然后在执⾏本地事务的回滚操作, 然后再开始在本地事务中执⾏⽇志SQL存储提交,再执⾏定时任务计时。 LCN代理连接池(提交事务) 在TM通知事务以后将开始执⾏本地事务的提交,本地事务的提交将会查询出执⾏的SQL然后执⾏业 务,再将插⼊SQL和删除⽇志的SQL在同⼀事物中⼀同执⾏。若是回滚操作的话,则直接就是删除执⾏的SQL,这只是与强⼀致差异性的地⽅,其他操作可参考强⼀致事务流程。

获取lcn原理PDF,项目文件代码,时序图,请关注公众号 猿之村,回复 分布式获取代码及资料

分布式事务LCN原理

分布式事务LCN原理

写在最后,感谢点赞关注收藏转发


以上是关于分布式事务LCN原理的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务框架 --- LCN

基于Dubbo的分布式事务框架(LCN)

浅谈分布式事务与TX-LCN

spring boot 分布式事务解决方案LCN

分布式事务-Tx-lcn

分布式事务的背景