东莞高端网站建设哪个好,成都做app定制开发多少钱,中国开发网站的公司,工商注册名字查重文章目录 分布式事务问题示例Seata概述、官网一个典型的分布式事务过程处理过程全局GlobalTransactional分布式交易解决方案流程图 Seata安装下载修改conf目录下的application.yml配置文件dashboard demo 分布式事务问题示例
单体应用被拆分成微服务应用#xff0c;原来的三个… 文章目录 分布式事务问题示例Seata概述、官网一个典型的分布式事务过程处理过程全局GlobalTransactional分布式交易解决方案流程图 Seata安装下载修改conf目录下的application.yml配置文件dashboard demo 分布式事务问题示例
单体应用被拆分成微服务应用原来的三个模块被拆分成三个独立的应用分别使用三个独立的数据源 业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证但是全局的数据一致性问题没法保证。
Seata概述、官网
官网 http://seata.io/zh-cn/ 下载 https://github.com/seata/seata/releases
一个典型的分布式事务过程
分布式事务处理过程的一ID三组件模型
Transaction ID XID全局唯一的事务IDTransaction Coordinator (TC)事务协调器维护全局事务的运行状态负责协调并驱动全局事务的提交或回滚Transaction Manager ™控制全局事务的边界负责开启一个全局事务并最终发起全局提交或全局回滚的决议Resource Manager (RM)控制分支事务负责分支注册、状态汇报并接收事务协调器的指令驱动分支本地事务的提交和回滚
处理过程
TM 向 TC 申请开启一个全局事务全局事务创建成功并生成一个全局唯一的 XIDXID 在微服务调用链路的上下文中传播RM 向 TC 注册分支事务将其纳入 XID 对应全局事务的管辖TM 向 TC 发起针对 XID 的全局提交或回滚决议TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
全局GlobalTransactional
相较于Spring的注解Transactional
分布式交易解决方案流程图 Seata安装
下载
版本1.7 https://github.com/seata/seata/releases
修改conf目录下的application.yml配置文件
先备份原始application.yml文件主要修改自定义事务组名称事务日志存储模式为db数据库连接信息示例参考application.example.yml建表sql在script/server/db
dashboard
http://localhost:7091/ 默认7091端口 切换中文
demo GlobalTransactional(name “fsp-create-order”,rollbackFor Exception.class) name自己取唯一就可rollbackFor异常抛出 未加该注释出现的问题示例中 accountService.decrease(order.getUserId(),order.getMoney());调用不成功但是会继续修改订单状态并且会减少账户中值
//Service全都使用Feign可设置Time.Sleep来模拟Feign调用不成功
//示例中
//GlobalTransactional(name fsp-create-order,rollbackFor Exception.class)
public void create(Order order)
{log.info(-----开始新建订单);//1 新建订单orderDao.create(order);//2 扣减库存log.info(-----订单微服务开始调用库存做扣减Count);storageService.decrease(order.getProductId(),order.getCount());log.info(-----订单微服务开始调用库存做扣减end);//3 扣减账户log.info(-----订单微服务开始调用账户做扣减Money);accountService.decrease(order.getUserId(),order.getMoney());log.info(-----订单微服务开始调用账户做扣减end);//4 修改订单状态从零到1,1代表已经完成log.info(-----修改订单状态开始);orderDao.update(order.getUserId(),0);log.info(-----修改订单状态结束);log.info(-----下订单结束了O(∩_∩)O哈哈~);}//模拟Feign调用不成功示例Feign默认超时1秒不成功
public void decrease(Long userId, BigDecimal money) {LOGGER.info(-------account-service中扣减账户余额开始);//模拟超时异常全局事务回滚//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }accountDao.decrease(userId,money);LOGGER.info(-------account-service中扣减账户余额结束);
}