微服务 16: Seata AT模式 并发测试(上)(文末有项目连接)

 文章知识来源主要来源于:赵俊夫先生的博客  以下为原文链接
https://blog.csdn.net/u011177064/category_9572944.html
本章介绍
主要为了测试 Seata AT模式 应对正常 正常  正常 并发的正常处理
1:测试:调用服务 添加@Transactional 或者 去除事务 同时 被调用服务 不添加事务
由于调用服务不管
    添加事务@Transactional(rollbackFor = RuntimeException.class)
    还是不加事务
该事务的作用域 只是当前服务的当前接口 不影响其他服务

同时provider服务 也是的就是执行 order_tbl的逻辑 没有添加事务
因此provider服务 的逻辑报错也不会影响
2:测试:调用服务 添加@GlobalTransactional 被调用服务 不添加事务
可以看到数据完全没有改变
同时调用服务 根据XID 回滚的相关日志
3:测试:调用服务 添加@GlobalTransactional 同时 被调用服务添加@Transactional
可以看到数据完全没有改变

同时发现被调用服务 的 XID 
在被调用服务开启了Transactional事务后还是保持不变
4:测试:调用服务 被调用服务 同时 添加@GlobalTransactional
可以看到数据完全没有改变

同时发现被调用服务 的 XID 
在被调用服务开启了@GlobalTransactional事务后还是保持不变
5:测试:把provider 服务 抛异常的代码去除
可以看到数据都正常了
同时order表的主键ID从1直接变成5了
说明之前插入后又回滚了
6:一个简单的结论
seata 的 AT模式 
在调用端添加@GlobalTransactional注解后
后续的被调用端 
    1:不添加任何事务
    2:添加@Transactional 事务
    3:添加@GlobalTransactional 事务  
都不会再影响 分布式事务   

所有我们应该把所有的增删 和 修改操作都添加 分布式事务吗?

需要注意seata 的 AT模式 的 分布式事务 是需要给数据库加锁的
对性能还是有损耗的。

因此建议如果确认该接口的后续调用不会影响调用到其他服务的增删 和 修改操作
建议添加@Transactional 事务即可
8:新增一个测试接口purchaseFirst(查看undo_log)
 @Override
    @GlobalTransactional(rollbackFor = RuntimeException.class)
    public void purchaseFirst(String userId, String commodityCode, Integer orderCount) {
        //为了与日志区分 使用 System打印日志

        System.out.println("我先进行调用 进入purchase 购买下单,模拟全局事务提交 请求");
        System.out.println("我先进行调用  order XID " + RootContext.getXID());

        //storageService服务  db_storage库  storage_tbl表
        storageFeignClientService.seatadeductStorage(commodityCode, orderCount);

        //休眠60秒,期间去调用其他接口
        try {
            Thread.sleep(1000*60);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("我先进行调用  休眠60秒,期间去调用其他接口");

        //providerService服务   db_order库  order_tbl表
        providerFeignClientService.seataCreateOrder(userId, commodityCode, orderCount);

    }
初始值 
Storage表的 count 为998
Order表有2条数据
    
原接口入参 userId 1001 新接口入参 userId 1002

测试流程:请求新接口  
 
 产生结果:
 Storage表的 count 为997
 Order表新增一条数据  userId 1002
 
 注意:在请求期间 storage的undo_log 表会出现数据
 其XID 正是请求ID :126860430807142400 


[图片上传失败...(image-1a9a88-1618753104257)]

9:进行并发测试 @GlobalTransactional
并发测试1:
初始值 
Storage表的 count 为997
Order表有三条数据  

测试流程:请求新接口   5秒后请求原有接口  
先清空idea的日志
   
进行两次测试(每次都把数据还原从成初始数据,注意修改Order的主键ID起始值)
 
两次测试结果都为 
Storage表的 count 为995
Order表新增两条数据   userId 1001 userId 1002

最终结果完全正常
期间 有可能undo_log  有一个(正常)
期间 有可能undo_log  有两个(不正常)(不知道为什么 同样的XID进入了两次)

并发测试2:
初始值 
Storage表的 count 为995
Order表有5条数据  

测试流程:请求新接口   5秒后请求原有接口  
先清空idea的日志

测试结果为 
Storage表的 count 为993
Order表新增两条数据   userId 1001 userId 1002
期间 有可能undo_log  有一个(正常)

并发测试3:
初始值 
Storage表的 count 为993
Order表有7条数据  

测试流程:请求新接口   5秒后请求原有接口   5秒后请求原有接口  
先清空idea的日志

测试结果为 
Storage表的 count 为990
Order表新增三条数据   userId 1001 userId 1001 userId 1002

[图片上传失败...(image-968199-1618753337730)]

期间 有可能undo_log  有一个(正常)
@GlobalTransactional并发测试结论:
@GlobalTransactional完成解决并发的请求
   
1:不管有多个并发的请求进来都能实现最终一致性

2:同一个请求在请求期间  不管是 生成一条undo_log  还是两条undo_log
    最终都数据都最终一致(由于Feign重复请求 后续会提及)

项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git

https://github.com/hesuijin/spring-cloud-alibaba-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git


在service-storage-demo 模块下   
在service-consumer-demo 模块下
在service-provider-demo 模块下   
在service-provider-demo-other 模块下
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容