LCN和Seata原理图
LCN:不生产事务,只是事务的协调者 LCN 核心采用3PC
原理:
1.发起方(如支付服务)执行业务时,会通过aop拦截@LcnTransaction注解,会生成一个事务组ID,保存到ThreadLocal,然后通过netty传递给tx-manager(事务协调者)创建一个事务分组
2执行业务代码,在调用其他服务接口(如订单服务)的时候,会把事务组ID存放到Http请求头传给参与方(订单服务)
3.参与方在Http请求头上收到分组id的时候,执行完业务不会提交事务,而是监听tx-manager(加入当前事务组)
4.发起方代码执行完后,通知给tx-manager是提交还是回滚,然后tx-manager通知给参与方做事务处理
Seata
角色:Transaction Coordinator 事务协调器、Transaction Manager 事务管理者、Resource Manager 资源管理器
原理 TM和RM都会被seate代理数据源
1.TM(如支付服务)执行业务时,会通过aop拦截@GlobalTransactional注解,会先查询ThreadLocal是否有XID,如果没有(表示TM),会请求TC创建一个XID,获取到XID,保存到ThreadLocal
2.在调用其他服务接口(如订单服务)的时候,会把XID存放到Http请求头传给RM(订单服务)
3.RM从请求头上获取到XID,会保存到Threadlocal,并且向TC注册事务分支
4.RM操作sql前,会记录前置镜像到undo_log表,然后执行sql,成功后再记录后置镜像到undo_log表(记录undo_log和执行业务sql是同一事务),然后提交事务
5.TM调用RM返回,继续执行业务,如果异常,通知TC,然后TC通知所有事务分支进行回滚
6.RM收到回滚通知,会执行后置镜像sql,将数据还原,然后删除当前XID中undo_log的镜像记录
7.如果成功,通知TC,然后TC通知所有事务分支
8..RM收到成功通知,删除当前XID中undo_log的镜像记录