seata流程和源码
2021-02-26 20:50:53 2 举报
seata流程, 源码分析
作者其他创作
大纲/内容
SeaTa
持有锁3
1000
失败
多了3条sql
人工
其他线程: 也减库存
前置镜像
读隔离
update account set money=money-10 where id=1
后置镜像
100
是
二阶段
核对数据库是否是后置镜像
一阶段:各玩各的
990
持有锁2
提交事务
select money from account where id=1 for update
锁1
提升业务sql的数量级
都成功了
所有sql一起提交
性能问题
后置
插入undo_log
原因
写隔离
释放锁1
否
成功
业务sql1
preparedstatementproxy
回滚
globallock
为什么会释放锁
业务sql
update account set money=money+1 where id=1
select money from account where id=1 for update
业务sql2
tm
持有锁1
释放锁2
关闭自动提交
支付服务:事务
静态代理:datasourceproxy
select numb from stock where id=1 for update
本质
隐藏的问题
cas
执行sql之前判断sql类型
update stock set numb=numb+1 where id=1
这种场景下: 加这个注解相当于没有作用吗?
@Transactiona
@Transactional
常规情况
业务
重构
delete没有后置镜像
rm
方法本身运行时异常
insert没有前置镜像
select numb from stock where id=1 for update
前置
@Transactional注解失效了
前置后置不具备原子性
无法破坏seata的原子性
@GlobalTransactional
常规方法
提交
源码:策略模式模板方法
收集
debug是阻止不了seata提交的
取消自动提交
datasource
库存服务:事务
时间线
释放锁
执行一条提交一条
删除所有的回滚日志
99
update stock set numb=numb-1 where id=1
tc
期望:前置----->>业务----->>后置 是一个原子性操作
0 条评论
下一页