Fescar TC-rollback流程
生活随笔
收集整理的這篇文章主要介紹了
Fescar TC-rollback流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
開篇
?這篇文章的目的主要是講解Fescar TC執(zhí)行rollback的流程,目的是講解清楚rollback流程中的一些步驟。
?遺憾的是因為rollback本身涉及Fescar的分支事務注冊上報,如果事先不了解Fescar的分支事務,有些邏輯理解起來會有一些奇怪,對于branchSession本身還未了解,所以只能單獨講解rollback流程。
背景
說明:
- 分支事務中數(shù)據(jù)的 本地鎖 由本地事務管理,在分支事務 Phase1 結束時釋放。
同時,隨著本地事務結束,連接 也得以釋放。 - 分支事務中數(shù)據(jù)的 全局鎖 在事務協(xié)調器側管理,在決議 Phase2 全局提交時,全局鎖馬上可以釋放。只有在決議全局回滾的情況下,全局鎖 才被持有至分支的 Phase2 結束。
這個設計,極大地減少了分支事務對資源(數(shù)據(jù)和連接)的鎖定時間,給整體并發(fā)和吞吐的提升提供了基礎。
這里需要重點指出的是:Phase1階段的commit()操作是各個分支事務本地的事務操作。Phase2階段的操作是全局的commit()和rollback()。TC-rollback流程指的就是Phase2階段。
TC rollback流程介紹
rollback主流程
- 1.根據(jù)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);// 執(zhí)行全局的rollback操作doGlobalRollback(globalSession, false);}return globalSession.getStatus();} }說明:
- 查找全局的GlobalSession對象。
- 關閉GlobalSession對象。
- 執(zhí)行全局的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操作調用生命周期監(jiān)聽器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());} }說明:
- 生命周期監(jiān)聽器的onClose()設置GlobalSession對象的active狀態(tài)為false。
- findGlobalSession()方法從DefaultSessionManager返回GlobalSession對象。
說明:
- doGlobalRollback()遍歷GlobalSession當中所有的branchSession執(zhí)行回滾操作。
- 內部涉及到GlobalSession的狀態(tài)遷移,這部分后面統(tǒng)一通過狀態(tài)遷移實現(xiàn)。
總結
以上是生活随笔為你收集整理的Fescar TC-rollback流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018年香港私隐公署接129宗资料外泄
- 下一篇: Redis过期策略及实现原理