seata使用说明及AT模式异常回滚失败记录
seata
1.seata的AT模式相关说明
2.配置说明
咱先不研究源码,下载个服务能跑就行,官网版本很多,这里基于1.4.2版本的做个说明
seata-server–非源码对应配置已经改好
习惯用file的可以配置对应类型,这里以nacos为例说明:
1.nacos中的操作,按如下截图来即可
新增命名空间(注意:seata配置中的namespace填id,名称值会导致配置读取不到)
2.根据readme中的说明和截图修改对应的数据库及nacos配置
导入脚本需要下载源码nacos-config.sh,或者下面补充的地方也可以尝试使用下
源码下载地址
上面的项目目录里加了包含.sh和.py文件
配置导入到nacos中的效果大致如下(没用的配置导了很多,其实不需要全都放进去):
3.客户端说明
1.如果本身是基于nacos注册的微服务对应读取配置即可
2.本地测的是两个普通的springboot服务,使用同一个事务组,服务互调来模拟微服务调用代码入口如下:
样例代码入口
主要用下面两个服务模拟
4.使用说明
1.nacos启动;
2.seata启动(windows直接运行):
3.客户端服务启动
4.使用案例说明:
场景一:
模拟调用报错后回滚
先查询数据库值:
断点acc -1已被提交
查库数据,事务已被提交
主动异常,数据回滚(也可查询seata日志观察,这里不截图展示)
场景二:
目标值中途被其他操作修改
中间事务为全局事务时:
中间事件请求-效果如下:
最终数据结果和场景一一致,会正常回滚
场景三
目标值中途被其他操作修改
中间事务为本地事务时:
本地事务将以提交数据再次减一
结果为9998
全局事务异常,回滚报错
seata反复重试
结论
1.seata的AT模式下,复杂流程中多个服务请求整体的全局事务完成前会被lock,但是本地事务是已提交的,回滚内容存入undo_log里,如果同为seata管理下的事务进行操作对应变更是无法提交的;
2.如果是非seata统一管理的事务,例如spring的本地事务,则会正常执行,如果恰好操作的是同一批数据,这种情况极有可能导致整个数据回滚失败,整个链路的数据都会被影响;
解决方案:
1.参考场景二的使用方式;
2.对于比较复杂的链路,建议做好代码层面主动补偿的
3.尝试seata的XA模式(待试验,后续有例子会贴出来)
更多推荐
所有评论(0)