先遗留两个问题
问题1:如果异常是在orderService子服务消费者内发生,orderItemService还会继续执行吗?觉得应该不会了吧?
问题2:如果orderService发生异常,但是又想orderItemService继续执行而且还能正常提交,这种场景怎么用seata呢?不会直接用trycatch吧,
正文:先看图后实践:
1:当Application(Controller)模拟Restful请求触发和返回下图
项目重新启动completed时间时09:34:01,异常事务测试是此时间之后。
2:事务提供者Service发起者GlobalTransaction(时间09:34:14开始),并进行业务order-insert,与orderItem-insert两个业务操作,流程是先begin new Global transaction 标识ip:id; 异常时又一次 Begin new Global transaction; 下图console执行 时间和日志
成功insert xid: ~1035 ; fail回滚:xid: ~1038 (xid是全局事务id)
2.1:查看服务消费者orderSevice(时间09:34:15开始); 由于Application模拟两次测试,第一次无RuntimeExp;第二次模拟测试触发的异常,所以orderSevice第一次模拟同时就会两段式事务机制并成功(下图SUCCESS蓝色区域onMessage:xid~1029,branchId=~1030),onMessage:xid~1035,branchId=~1036
第二次模拟RuntimeExp,当全局事务触发RuntimeExp, orderSevice重新onMessage:xid~1038,branchId=~1039,下图FAIL 红色区域,进行事务回滚
2.2:同理:服务消费者orderItemProvider,消费成功及回滚失败同” 服务消费者orderSevice“(时间09:34:14开始) orderSevice是onMessage:xid~1038,branchId=~1039;orderItemProvider是onMessage:xid~1038,branchId=~1040
3: seata数据库日志