当前位置: 首页 > news >正文

inurl 网站建设小程序开发公司排行榜

inurl 网站建设,小程序开发公司排行榜,万网域名注册官网查询入口,广告装饰 技术支持 东莞网站建设这篇博客来记录在发起全局事务回滚时#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中#xff0c;有说到过#xff0c;事务发起者在发现分支事务执行异常之后#xff0c;会提交全局事务回滚的请求到netty服务端#xff0c;这里是发…这篇博客来记录在发起全局事务回滚时服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中有说到过事务发起者在发现分支事务执行异常之后会提交全局事务回滚的请求到netty服务端这里是发送全局事务回滚请求的代码同样这里的GlobalRollbackRequest这个对象很重要可以看到在netty客户端这里只入参了XID这个xid贯穿了全局上下文在服务端就是根据这里xid来确定是要处理哪个全局事务 2. 服务端处理逻辑 在前面netty全局事务开启服务端源码中有介绍过netty服务端接收到客户端的请求之后最终会进入到这个方法中根据请求的对象类型来决定是有哪个对象来处理 io.seata.server.AbstractTCInboundHandler#handle(io.seata.core.protocol.transaction.GlobalRollbackRequest, io.seata.core.rpc.RpcContext) 在这个方法中会继续调度 可以发现在doGlobalRollback方法中最终调用了core.rollback() 2.1 io.seata.server.coordinator.DefaultCore#rollback 在这里执行回滚的时候有三个步骤 根据xid找到netty服务端的globalSession调用globalSession的close()方法这个方法只是把globalSession的active属性设置为false了最后会调用doGlobalRollback()方法最核心的逻辑在这个方法中 2.2 doGlobalRollback io.seata.server.coordinator.DefaultCore#doGlobalRollback 下面这是执行全局事务回滚的核心代码 会先根据全局事务获取到所有的分支事务然后依次遍历所有的分支事务如果分支事务是失败状态就直接删除分支事务(从branchTable中删除)branchRollback 这里是通过netty请求触发分支事务进行回滚的逻辑这个下面单独说接着就会对分支事务回滚成功/失败做出相应的处理如果处理成功会把branchTable和lockTable中的数据删除最后在所有分支事务都处理之后对全局事务进行处理endRollbacked 在这个方法中会把globalTable中的全局事务删除 public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {boolean success true;// start rollback event 这里没看懂先跳过eventBus.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC,globalSession.getTransactionName(), globalSession.getBeginTime(), null, globalSession.getStatus()));// 判断当前事务使用的模式if (globalSession.isSaga()) {success getCore(BranchType.SAGA).doGlobalRollback(globalSession, retrying);} else {for (BranchSession branchSession : globalSession.getReverseSortedBranches()) {BranchStatus currentBranchStatus branchSession.getStatus();if (currentBranchStatus BranchStatus.PhaseOne_Failed) {/*** 1.如果分支事务是failed状态直接remove就是从branchTable表中删除记录*/globalSession.removeBranch(branchSession);continue;}try {/*** 2.调用客户端进行分支事务回滚* 如果回滚成功会在removeBranch中先删除lockTable的记录* 再删除branchTable的记录*/BranchStatus branchStatus branchRollback(globalSession, branchSession);switch (branchStatus) {/*** 这是rm正常进行事务回滚的返回结果如果rm进行了sql回滚并且undolog日志正常删除* 那这里就会将lockTable和branchTable的记录删除*/case PhaseTwo_Rollbacked:globalSession.removeBranch(branchSession);LOGGER.info(Rollback branch transaction successfully, xid {} branchId {}, globalSession.getXid(), branchSession.getBranchId());continue;case PhaseTwo_RollbackFailed_Unretryable:/*** rm抛出unretryable异常的话会执行这里将全局事务删除*/SessionHelper.endRollbackFailed(globalSession);LOGGER.info(Rollback branch transaction fail and stop retry, xid {} branchId {}, globalSession.getXid(), branchSession.getBranchId());return false;default:LOGGER.info(Rollback branch transaction fail and will retry, xid {} branchId {}, globalSession.getXid(), branchSession.getBranchId());if (!retrying) {globalSession.queueToRetryRollback();}return false;}} catch (Exception ex) {StackTraceLogger.error(LOGGER, ex,Rollback branch transaction exception, xid {} branchId {} exception {},new String[] {globalSession.getXid(), String.valueOf(branchSession.getBranchId()), ex.getMessage()});if (!retrying) {globalSession.queueToRetryRollback();}throw new TransactionException(ex);}}// In db mode, there is a problem of inconsistent data in multiple copies, resulting in new branch// transaction registration when rolling back.// 1. New branch transaction and rollback branch transaction have no data association// 2. New branch transaction has data association with rollback branch transaction// The second query can solve the first problem, and if it is the second problem, it may cause a rollback// failure due to data changes.GlobalSession globalSessionTwice SessionHolder.findGlobalSession(globalSession.getXid());if (globalSessionTwice ! null globalSessionTwice.hasBranch()) {LOGGER.info(Rollbacking global transaction is NOT done, xid {}., globalSession.getXid());return false;}}if (success) {// 在这里的end方法中会删除globalTable中的记录SessionHelper.endRollbacked(globalSession);// rollbacked eventeventBus.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC,globalSession.getTransactionName(), globalSession.getBeginTime(), System.currentTimeMillis(),globalSession.getStatus()));LOGGER.info(Rollback global transaction successfully, xid {}., globalSession.getXid());}return success; }2.3 分支事务回滚 branchRollback(globalSession, branchSession); io.seata.rm.DefaultResourceManager#branchRollback 服务端会通过发送netty请求(在2.2 中的branchRollback)触发rm这边开始进行分支事务的回滚最终会在rm这边的这个类中进行分支事务回滚的操作 在执行回滚操作的时候会根据branchType获取对应的manager 在这里会根据当前的dbType找到对应的undoLogManager然后调用其undo方法进行分支事务回滚 io.seata.rm.datasource.undo.AbstractUndoLogManager#undo 在这里的undo方法中会生成回滚sql执行然后删除undolog日志代码太长了但是逻辑不多就不贴代码了 2.4 删除分支事务 我们接着上面2.2的逻辑来看在调用netty请求rm这一端进行了事务回滚之后对于seata服务端这边只需要把分支事务和全局事务删除即可 在2.2 的代码中会对netty请求返回的状态进行判断branchStatus 如果是PhaseTwo_Rollbacked表示分支事务处理成功此时会进入到globalSession.removeBranch(branchSession);来进行处理 在这个方法中有两个逻辑解锁和removeBranch那就不用想了肯定是删除分支事务加的锁和删除分支事务 io.seata.server.session.BranchSession#unlockio.seata.server.storage.db.lock.DataBaseLockManager#releaseLockio.seata.server.storage.db.lock.DataBaseLocker#releaseLock(java.lang.String, java.lang.Long)io.seata.server.storage.db.lock.LockStoreDataBaseDAO#unLock(java.lang.String, java.lang.Long)对于释放锁的逻辑比较简答中间会调用的时候会指定xid和branchId然后去构建删除的sql 我们接着来看删除分支事务的代码 这就是分支事务删除的逻辑这个逻辑也比较简单大部分都是共用的逻辑就不做过多的介绍了 2.5 全局事务删除 SessionHelper.endRollbacked(globalSession);在这个方法中会处理全局事务 这里看起来也有两个逻辑在clean()方法中我最开始没有看懂这个clean中要做什么因为在clean中就直接调用了下面截图中的这个releaselock方法看到这个方法中的这行代码之后我好像明白了这里是再尝试将所有分支事务的锁进行释放的逻辑 我们接着来看onEnd()的逻辑 这就是全局事务删除的逻辑 总结 对于分布式事务进行全局回滚的逻辑还是比较简单的 在事务管理者这边发起全局事务回滚的请求seata服务端也就是事务协调者接收到请求之后会向所有的rm发起netty请求进行分支事务的处理各个分支事务会根据undoLog日志生成回滚的sql然后执行seata服务端在等分支事务返回状态之后会先删除分支事务在删除分支事务之前会将分支事务加的锁给删除这里的锁如果是mysql的话其实就是写入到mysql中的一条记录最后会去处理globalSession将globalSession从mysql表中删除 所以其实分支事务回滚的时候就是把全局事务 分支事务 锁 从mysql表中删除
http://www.dnsts.com.cn/news/841.html

相关文章:

  • 文件乱码了怎么恢复百度网站怎么优化排名
  • 百度做网站投广告百度推广开户渠道公司
  • 网络推广公司电话神马seo教程
  • 广州外贸独立网站制作最新的国际新闻
  • 成都手机网站建设网站优化关键词排名公司
  • 专业集团门户网站建设方案写文章免费的软件
  • 做楼房信息网站的作用全国新冠疫苗接种率
  • wordpress搬家问号日喀则网站seo
  • 建筑工程公司需要哪些资质证书seo推广的全称是
  • 做网站多少钱啊网址域名大全
  • 怎样用ps设计网站模板公司网络搭建
  • 网络公司网站建设方案图片在线转外链
  • 长春网站免费制作seo查询是什么意思
  • 备案成功的网站深圳关键词优化公司哪家好
  • 天津南开区网站建设公司搜索推广出价多少合适
  • 网站图片批量上传360开户
  • 导航网站制作关键词优化搜索引擎
  • 广东佛山建网站竞价开户推广
  • 开发app应用公司排名seo手机端排名软件
  • 网站添加标签云百度百家号官网
  • 学生网页设计模板素材seo 服务
  • 商用图片的网站服务外包公司
  • 石狮网站建设公司seo销售话术开场白
  • 北京城乡建设委员会网站微信广告推广平台
  • 杭州网站建设网络公司c++培训班学费一般多少
  • h5制作软件app手机版深圳债务优化公司
  • 王业美三个字组成的子南京seo外包
  • 什么是网站单页成人专业技能培训机构
  • 转塘有做网站的吗宜兴网站建设
  • 广告彩页设计搜索引擎优化的核心是