初探
下载官方代码:https://gitee.com/mirrors/Spring-Cloud-Alibaba.git
目前的最新seata版本为1.4.
根据MD,分别启动4个服务。
主要业务有3项
- 扣除商品库存
- 扣除用户金额
- 创建订单
demo 中有feign,rest 两种服务掉用方式
http://127.0.0.1:18081/seata/feign
http://127.0.0.1:18081/seata/rest
后台操作修改数据为: 库存 》 用户表 》订单表
当报错的服务为用户服务时,将断点打到 “用户服务” 报错位置:
OrderService 和 AccountService 中 使用 Random.nextBoolean() 的方式来随机抛出异常,模拟了在服务调用时随机发生异常的场景。
这时可以看出,库存表的数据,其实已经被修改了,并且 undo_log 表已经插入了库存业务数据标识
当执行完代码后,数据回滚为原始数据,undo_log 缓存数据删除。
由于写隔离可得知:就算本地事务提交,库存表已经修改,但是其他事务仍然无法对已修改的数据进行提交性质的修改,因为全局锁一直为当前事务所持有。
由于读隔离可得知,Seata AT模式默认 读未提交,所以有可能读到脏数据。此问题可以用 for update 方法解决。