LCN分布式事务分析(图+代码)

5 篇文章 0 订阅
2 篇文章 0 订阅


前言

如果有懂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有时候也称作为
TransactionManager,是负责控制整个事务保存⼀致性的控制节点,也记录事务中可能出现的特殊情况与各阶段的操作⽇志数据⽤于调试追溯。

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

在这里插入图片描述
步骤介绍:
业务⽅法(开始事务)
开始事务是指参与⽅或者发起⽅开始执⾏⾃⼰的业务时开启事务操作,对应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,项目文件代码,时序图,请关注公众号 猿之村,回复 分布式获取代码及资料

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

欢迎关注我的微信公众号 【猿之村】
在这里插入图片描述

来聊聊Java面试
加我的微信进一步交流和学习,微信手动搜索
【codeyuanzhicunup】添加即可
如有相关技术问题欢迎留言探讨,公众号主要用于技术分享,包括常见面试题剖析、以及源码解读、微服务框架、技术热点等。

编辑推荐: 本文来自于csdn,本篇文章主要介绍了LCN5.0.2有3种模式,分别是LCN模式,TCC模式,TXC模式,希望对您的学习 有所帮助。 一、简介 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果。 LCN模式: LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。 该模式的特点: - 该模式对代码的嵌入性为低。 - 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。 - 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。 - 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。 TCC模式: TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务。 该模式的特点: - 该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。 - 该模式对有无本地事务控制都可以支持使用面广。 - 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。 TXC模式: TXC模式命名来源于淘宝,实现原理是在执行SQL之前,先查询SQL的影响数据,然后保存执行的SQL快走信息和创建锁。当需要回滚的时候就采用这些记录数据回滚数据库,目前锁实现依赖redis分布式锁控制。 该模式的特点: - 该模式同样对代码的嵌入性低。 - 该模式仅限于对支持SQL方式的模块支持。 - 该模式由于每次执行SQL之前需要先查询影响数据,因此相比LCN模式消耗资源与时间要多。 - 该模式不会占用数据库的连接资源。 二、原理 核心步骤 1.创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 2.添加事务组 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。 3.关闭事务组 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。 事务控制原理 LCN事务控制原理是由事务模块TxClient下的代理连接池与TxManager的协调配合完成的事务协调控制。 TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。 对于代理连接池的优化 自动超时机制,任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时间加上限制。 智能识别创建不同的连接 对于只读操作、非事务操作LCN将不开启代理功能,返回本地连接对象,对于补偿事务的启动方将开启回滚连接对象,执行完业务以后马上回滚事务。 LCN连接重用机制 当模块在同一次事务下被重复执行时,连接资源会被重用,提高连接的使用率。 事务补偿机制 为什么需要事务补偿? 事务补偿是指在执行某个业务方法时,本应该执行成功的操作却因为服务器挂机或者网络抖动等问题导致事务没有正常提交,此种场景就需要通过补偿来完成事务,从而达到事务的一致性。 补偿机制的触发条件? 当执行关闭事务组步骤时,若发起方接受到失败的状态后将会把该次事务识别为待补偿事务,然后发起方将该次事务数据异步通知给TxManager。TxManager接受到补偿事务以后先通知补偿回调地址,然后再根据是否开启自动补偿事务状态来补偿或保存该次切面事务数据。 补偿事务机制 LCN的补偿事务原理是模拟上次失败事务的请求,然后传递给TxClient模块然后再次执行该次请求事务。 模拟场景演示 若存在事务发起方、参与方A、参与方B。调用关系如下 那么他们正常执行业务的时序为: 若参与方B出现异常,那么他们的业务时序为: 若他们的调用关系是这样的情况 此时发生参与方B出现异常时他们的时序为: 三、使用 环境: SpringBoot 2.0.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值