我们用的是 seata,下载seata,然后注册进 nacos,用 MySQL 持久化,在项目中引入相关依赖,用 seata 对数据源进行代理,在需要加分布式事务的方法或类加上 @Global Transaction 注解即可。
8. 对 seata 的原理了解吗?
seata 的核心就是三个组件加一个 ID。一个 ID 是指全局事务的 ID,三个组件是事务管理者,就是加了全局事务注解的方法;事务协调者,就是安装的 seata 组件;资源管理器,就是数据库。加了全局事务注解的方法向 seata 申请开启一个全局事务,seata 就会返回一个全局事务 ID在微服务调用链路中传播;数据库向 seata 注册分支事务,将其纳入到全局事务 ID 的管辖中;加了注解的方法发起对全局事务的提交或者回滚,然后 seata 再告诉数据库对事务进行提交或者回滚。
9. seata 的 AT 模式如何做到对业务无侵入的?
使用了两阶段提交协议。首先 seata 会拦截业务 SQL,将更新前的数据保存为 before image,然后执行 SQL 更新数据,再将更新后的数据保存为 after image,同时会生成行锁;如果顺利,二阶段就提交事务,删除 before image 和 after image 以及行锁;如果二阶段要回滚,首先会比较当前数据和 after image 是否一致,如果一致,将其还原成 before image,否则就是异常情况,人工处理。