免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Seata Server 1.5.2 源碼學習( 二 )


  • 給GlobalSession添加一個監(jiān)聽器SessionManager
  • session.begin()

  • Seata Server 1.5.2 源碼學習

    文章插圖
    開啟事務,創(chuàng)建一個全局事務,如果是seata.store.mode=db的話,向global_table表插入一條記錄
    2. 分支事務注冊
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    DefaultCore#branchRegister()
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    如果是AT模式,這里調(diào)用的就是ATCore#branchSessionLock()
    ATCore#branchSessionLock()檢查是否拿到鎖了
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    具體每種鎖的實現(xiàn)就不往下看了,挑其中一個看下,就RedisLocker吧
    Seata Server 1.5.2 源碼學習

    文章插圖
    總之,分支注冊的時候需要檢查鎖,拿到本次事務中所涉及的所有需要加鎖的行的鎖才能注冊成功
    所有行都加鎖成功,分支注冊才算成功,才會返回true
    再回到AbstractCore#branchRegister(),整個方法是放在SessionHolder#lockAndExecute()中執(zhí)行的
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    總結(jié)一下,分支注冊:
    1. 創(chuàng)建一個BranchSession
    2. 加鎖,獲取所有行的鎖
    3. 將BranchSession加到GlobalSession中
    4. 返回branchId

    Seata Server 1.5.2 源碼學習

    文章插圖
    分支注冊,創(chuàng)建BranchSession,獲取全局鎖成功后將branchSession加入globalSession
    3. 提交全局事務
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    首先判斷全局事務狀態(tài)是否為begin,如果不是則不應該提交 。如果是,則將事務active置為false,釋放全局鎖,判斷是否可以異步提交 。分支類型是AT的都可以異步提交,因此AT模式,默認是異步提交 。如果不能異步提交,則采取同步提交 。
    3.1. 同步提交
    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖

    Seata Server 1.5.2 源碼學習

    文章插圖
    遍歷所有已注冊的分支事務,向分支發(fā)送同步請求,告訴它全局事務開始提交了,不出意外的情況下返回分支狀態(tài)是二階段提交成功 。當所有分支都提交成功,則返回true,于是全局事務提交成功,返回全局事務狀態(tài)為已提交 。如果有分支提交失敗,則返回false,全局事務提交失敗,返回全局狀態(tài)為提交失敗 。如果拋異常了,則會有定時任務稍后重試提交 。

    經(jīng)驗總結(jié)擴展閱讀