zoukankan      html  css  js  c++  java
  • seata原理

    seata支持的事务模式:AT、TCC、SAGA、XA

    AT模式

    seata的AT模式必须有sql事务支持

    seata-at事务流程图

    25-seata-at事务流程图.jpg
    在有数据库参与的情况下,TM、RM都有sql事务的支持,注意:
    1.在第3步释放资源
    2.在第5步提交的时候:直接删除回滚日志

    seata-at事务的本地锁和全局锁

    25-seata-at事务的本地锁和全局锁.jpg

    写隔离:避免了脏写

    读隔离:select ... for update

    TCC模式

    TCC没有全局锁的概念,也没有回滚日志,靠的是执行业务逻辑回滚,不依靠本地事务

    seata-tcc事务流程图

    26-seata-tcc事务流程图.jpg

    转账余额变动问题

    使用seata-tcc事务模型在转账和收账过程中可能使余额不停地变动,两者相互影响

    26-seata-tcc转账余额异常解决.jpg

    seata-tcc事务模型可能产生的三种问题

    空回滚

    空回滚:try未执行sql操作,cancel执行,try不会再次执行

    解决方案:加事务控制表

    {

    ​ tx_id(全局事务id)

    ​ branch_id(分支事务id)

    ​ 状态(1.事务初始化 2.已提交 3.已回滚)

    }

    answer:执行cancel时检查状态是否为1(事务初始化),是-正常执行cancel,否-执行个空cancel

    幂等

    幂等:多次执行cancel,confirm

    解决方案:加事务控制表

    {

    ​ tx_id(全局事务id)

    ​ branch_id(分支事务id)

    ​ 状态(1.事务初始化 2.已提交 3.已回滚)

    }

    answer:执行cancel,confirm前检查状态是否已变更,是-抛异常或者执行空操作,否-正常执行cancel,confirm

    悬挂

    悬挂:cancel在try之前,try操作超时了并且会再次执行

    解决方案:加事务控制表

    {

    ​ tx_id(全局事务id)

    ​ branch_id(分支事务id)

    ​ 状态(1.事务初始化 2.已提交 3.已回滚)

    }

    answer:cancel的时候,新增一条记录(如果原来没有记录,执行空方法,再插入已回滚的状态。)这样再次执行try操作时,发现有记录,执行空try

  • 相关阅读:
    服务器上的vhost
    php解压缩文件方法汇总
    STM32新起航-TMP1
    实现
    如何协调项目与领导?
    《致加西亚的一封信》读后感
    致加西亚的信
    本周设计部分及作业
    对·作业提交项目作业模块需求的编写(赵刚,段超凡)
    (第三周)团队模式中对交响乐团模式的理解
  • 原文地址:https://www.cnblogs.com/zheaven/p/15568321.html
Copyright © 2011-2022 走看看