seata原理

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表记录即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容