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模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章