美文网首页
seata原理

seata原理

作者: 阔阔飞翔 | 来源:发表于2021-06-17 15:02 被阅读0次

    1、Seata和LCN的区别

    1. 基本实现思路是一样的,唯一区别在于回滚方式,LCN采用代理数据源假关闭连接,暂时不提交本地事务(不提交也不回滚),但是容易造成死锁。

       -- 假关闭其实就是api,因为连接也是可以被aop代理的,原生的commit被拦截到就不会走commit会进行wait线程等待,等待全局事务协调者发送通知是提交还是回滚。

    2. seata采用undo_log的形式逆向生成sql语句实现回滚。

    lcn存在问题:容易死锁。

    例如:事务协调者宕机,无法通知参与方是提交还是回滚,所以线程会一直被占用(死锁)。

    2、Seata四种模式

    https://seata.io/zh-cn/docs/dev/mode/at-mode.html

    默认AT模式(逆向sql)

    AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。

    TCC 模式对代码侵入比较高,是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。

    其余两种使用的不多。

    (1)发起方TM会向我们的TC协调者申请一个全局的事务id,保存到threadlocal中;

    (2)TM和RM都会被Seata代理数据源,在sql执行之前和之后保存原来和修改后日志到undo_log中,方便后期实现回滚;

    (3)TM从请求头中传递该全局的事务id给RM,RM从请求中头中获取到该全局事务id,并且向TC注册自己的事务id。

    (4)如果TM调用接口成功之后,如果报错的情况下则通知给协调者,协调者在告诉所有的分支都开始回滚,直接根据本地事务id+xid查询undo_log表 ,逆向生成sql语句回滚,同时删除该undo_log日志。

    (5)如果TM调用接口成功之后,如果没有报错的情况下则通知给协调者,协调者在告诉所有的分支都开始提交事务,直接根据本地事务id+xid删除对应的undo_log表记录即可。

    相关文章

      网友评论

          本文标题:seata原理

          本文链接:https://www.haomeiwen.com/subject/kdscyltx.html