• 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

  • 相关阅读:
    替换URL传递的参数
    执行SQl语句得到xml结果集
    table中文本太长换行
    org.xml.sax.SAXNotRecognizedException
    WAMP+CMSeasy快速搭建学校网站
    推荐几个web前台开发的小工具
    来园子里注册啦
    C++ Virtual的背后
    Games101观后补充笔记
    Lua语法入门
  • 原文地址:https://www.cnblogs.com/zheaven/p/15568321.html
Copyright © 2020-2023  润新知