日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fescar TC-rollback流程

發布時間:2025/3/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fescar TC-rollback流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

開篇

?這篇文章的目的主要是講解Fescar TC執行rollback的流程,目的是講解清楚rollback流程中的一些步驟。

?遺憾的是因為rollback本身涉及Fescar的分支事務注冊上報,如果事先不了解Fescar的分支事務,有些邏輯理解起來會有一些奇怪,對于branchSession本身還未了解,所以只能單獨講解rollback流程。


背景


說明:

  • 分支事務中數據的 本地鎖 由本地事務管理,在分支事務 Phase1 結束時釋放。
    同時,隨著本地事務結束,連接 也得以釋放。
  • 分支事務中數據的 全局鎖 在事務協調器側管理,在決議 Phase2 全局提交時,全局鎖馬上可以釋放。只有在決議全局回滾的情況下,全局鎖 才被持有至分支的 Phase2 結束。

這個設計,極大地減少了分支事務對資源(數據和連接)的鎖定時間,給整體并發和吞吐的提升提供了基礎。

這里需要重點指出的是:Phase1階段的commit()操作是各個分支事務本地的事務操作。Phase2階段的操作是全局的commit()和rollback()。TC-rollback流程指的就是Phase2階段。


TC rollback流程介紹

rollback主流程

  • 1.根據transactionId查找begin階段生成的GlobalSession對象。
  • 2.對GlobalSession對象進行close操作。
  • 3.TC通知所有RM(各分支事務的資源管理器)進行全局回滾操作(doGlobalRollback)。


TC rollback源碼分析

public class DefaultCore implements Core {public GlobalStatus rollback(String xid) throws TransactionException {// 查找全局GlobalSession對象GlobalSession globalSession = SessionHolder.findGlobalSession(XID.getTransactionId(xid));if (globalSession == null) {return GlobalStatus.Finished;}GlobalStatus status = globalSession.getStatus();// Highlight: Firstly, close the session, // then no more branch can be registered.// 關閉全局的GlobalSession對象。globalSession.close(); if (status == GlobalStatus.Begin) {globalSession.changeStatus(GlobalStatus.Rollbacking);// 執行全局的rollback操作doGlobalRollback(globalSession, false);}return globalSession.getStatus();} }

說明:

  • 查找全局的GlobalSession對象。
  • 關閉GlobalSession對象。
  • 執行全局的rollback操作。


GlobalSession關閉操作

public class GlobalSession implements SessionLifecycle, SessionStorable {public void close() throws TransactionException {if (active) {for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {lifecycleListener.onClose(this);}}}public void onEnd(GlobalSession globalSession) throws TransactionException {removeGlobalSession(globalSession);}public void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException {updateGlobalSessionStatus(globalSession, status);}public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException {transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session);}public void changeStatus(GlobalStatus status) throws TransactionException {for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {lifecycleListener.onStatusChange(this, status);}this.status = status;}}
  • GlobalSession的close操作調用生命周期監聽器lifecycleListener.onClose()。
  • lifecycleListener指的是DefaultSessionManager對象。


DefaultSessionManager操作

public class SessionHolder {public static GlobalSession findGlobalSession(Long transactionId) throws TransactionException {return getRootSessionManager().findGlobalSession(transactionId);} }public class DefaultSessionManager extends AbstractSessionManager {}public abstract class AbstractSessionManager implements SessionManager, SessionLifecycleListener {protected Map<Long, GlobalSession> sessionMap = new ConcurrentHashMap<>();public GlobalSession findGlobalSession(Long transactionId) throws TransactionException {return sessionMap.get(transactionId);}public void onClose(GlobalSession globalSession) throws TransactionException {globalSession.setActive(false);}public void removeGlobalSession(GlobalSession session) throws TransactionException {transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, session);sessionMap.remove(session.getTransactionId());} }

說明:

  • 生命周期監聽器的onClose()設置GlobalSession對象的active狀態為false。
  • findGlobalSession()方法從DefaultSessionManager返回GlobalSession對象。


public class DefaultCore implements Core {public void doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {for (BranchSession branchSession : globalSession.getReverseSortedBranches()) {BranchStatus currentBranchStatus = branchSession.getStatus();if (currentBranchStatus == BranchStatus.PhaseOne_Failed) {continue;}try {BranchStatus branchStatus = resourceManagerInbound.branchRollback(XID.generateXID(branchSession.getTransactionId()), branchSession.getBranchId(),branchSession.getResourceId(), branchSession.getApplicationData());switch (branchStatus) {case PhaseTwo_Rollbacked:globalSession.removeBranch(branchSession);LOGGER.error("Successfully rolled back branch " + branchSession);continue;case PhaseTwo_RollbackFailed_Unretryable:changeToRollbackFailedStatus(globalSession);globalSession.end();LOGGER.error("Failed to rollback global[" + globalSession.getTransactionId() + "] since branch[" + branchSession.getBranchId() + "] rollback failed");return;default:LOGGER.info("Failed to rollback branch " + branchSession);if (!retrying) {queueToRetryRollback(globalSession);}return;}} catch (Exception ex) {LOGGER.info("Exception rollbacking branch " + branchSession, ex);if (!retrying) {queueToRetryRollback(globalSession);if (ex instanceof TransactionException) {throw (TransactionException) ex;} else {throw new TransactionException(ex);}}}}if (globalSession.hasBranch()) {changeToRollbackFailedStatus(globalSession);} else {changeToRollbackedStatus(globalSession);}globalSession.end();} }

說明:

  • doGlobalRollback()遍歷GlobalSession當中所有的branchSession執行回滾操作。
  • 內部涉及到GlobalSession的狀態遷移,這部分后面統一通過狀態遷移實現。

總結

以上是生活随笔為你收集整理的Fescar TC-rollback流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 狂野欧美性猛交xxⅹ李丽珍 | 黄色av网站在线免费观看 | a毛片毛片av永久免费 | 国产a线| 亚洲青青操 | 日本少妇裸体 | 涩涩涩涩涩涩涩涩涩涩 | 久久综合免费视频 | 青青草国产成人av片免费 | 国产在线视频在线观看 | 天天插天天干天天操 | 亚洲人妻电影一区 | 天天干天天插天天操 | www,99| 国产美女作爱视频 | 亚洲一区中文字幕在线 | 熟女自拍一区 | 风流老熟女一区二区三区 | 人人干人人看 | 亚洲人在线播放 | 成人性爱视频在线观看 | 日本欧美韩国国产精品 | 北条麻妃久久精品 | 日韩精品在线观看视频 | 日本亚洲欧美在线 | 黄色片一级 | 午夜爱爱毛片xxxx视频免费看 | 日韩免费二区 | 大色av | 91色国产| www久久久| 亚洲精品一区二区三区四区五区 | 麻豆av在线免费观看 | 精品美女一区二区三区 | 亚洲+小说+欧美+激情+另类 | 男人插入女人阴道视频 | 无码精品a∨在线观看中文 福利片av | 人人妻人人爽一区二区三区 | 18视频在线观看娇喘 | 日韩视频一区在线观看 | 91色在线视频 | 中日韩黄色大片 | 色老汉av一区二区三区 | 欧美熟妇乱码在线一区 | 黑人黄色录像 | 日本一区二区三区中文字幕 | 国产www视频 | 午夜爱爱毛片xxxx视频免费看 | 欧色丰满女同hd | 成人av激情 | 黑人黄色录像 | 国产成人精品亚洲精品色欲 | 亚洲一区不卡 | 精品免费国产一区二区三区四区 | 欧美不在线 | 黑人一区二区三区四区五区 | 亚洲精品在线中文字幕 | 99riav国产精品 | 午夜av大片| 欧美视频xxxx| 欧美少妇xxxxx | 日本免费在线视频 | 国产精品激情偷乱一区二区∴ | 国产精品97 | 国产日韩欧美电影 | 乱妇乱女熟妇熟女网站 | 成人性视频网站 | 国产伦精品一区 | 国产成人午夜高潮毛片 | 91色影院 | 男人操女人视频网站 | 午夜久久久精品 | 98堂 最新网名 | 台湾佬中文字幕 | 一级黄色大片免费观看 | free性欧美69巨大 | 欧美在线一二三四区 | 亚洲青色在线 | 一区二区三区免费看视频 | 小少妇哺乳喂奶播放 | 在线播放少妇奶水过盛 | 国产精品偷乱一区二区三区 | 国产主播啪啪 | 成人高清在线 | 亚洲欧美久久 | 日本不卡一区二区 | 亚洲av无码一区二区乱子仑 | 日本成人免费在线视频 | 亚洲裸体网站 | 草草福利视频 | 我和我的太阳泰剧在线观看泰剧 | 亚洲国产精品毛片av不卡在线 | 亚洲国产视频一区二区 | av在线综合网 | 国产精品国产三级国产aⅴ浪潮 | 一本久道综合色婷婷五月 | 欧美成一区二区三区 | 免费网站看av | 国模精品一区 |