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表记录即可。
网友评论