美文网首页
使用seata的AT模式实现分布式事务

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

作者: Figo_OU | 来源:发表于2023-11-28 17:48 被阅读0次

    我们现在来模拟分布式事务还没总体确认,还在中间状态的情况:
    我们可以看到,这三个表的数据,还没有发生改变,但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创建对应的前后镜像,用于回滚和写入的确认。

    相关文章

      网友评论

          本文标题:使用seata的AT模式实现分布式事务

          本文链接:https://www.haomeiwen.com/subject/cicxgdtx.html