使用seata的AT模式实现分布式事务

2023-11-28  本文已影响0人  Figo_OU

我们现在来模拟分布式事务还没总体确认,还在中间状态的情况:
我们可以看到,这三个表的数据,还没有发生改变,但undo_log多了三条数据。

SELECT * FROM `seata`.`t_account` LIMIT 0,1000;
SELECT * FROM `seata`.`t_order` LIMIT 0,1000;
SELECT * FROM `seata`.`t_stock` LIMIT 0,1000;

SELECT * FROM `seata`.`undo_log` LIMIT 0,1000;
--我们解析一下blog来看看数据到底是什么
SELECT CONVERT(rollback_info USING utf8mb4) FROM undo_log 
undo_log
转换后的blob

转换之后,我们看到undo_log里面其实是有前后镜像的。保存的是,事务操作之前和之后的数据切片。
而且t_order,t_account也有,一次购买操作添加了三条的undo_log日志。

前后镜像作用:
前镜像:用于回退之前的切片状态。
后镜像:用于确认写入的数据

可能你会有这个问题:如果多线程来买的时候会怎么样?例如A先来买了2,B再来买2.库存先扣减成998了,B的前后镜像不就是:前998,后996啦?如果A回滚了,B的最终结果不就有问题了?
a:其实在买A的时候,库存已经锁住了,B再来的时候要不等,要不fast fail。

总结:AT模式就是用了动态代理的方式,给全局事务方法创建了一个代理bean,代理对象在被调用的时候,会去undo_log创建对应的前后镜像,用于回滚和写入的确认。

上一篇下一篇

猜你喜欢

热点阅读