当前位置: 首页 > news >正文

分布式事务Seata使用不当引发的全局锁问题

报错信息

2025-08-12T19:36:27.803+08:00 ERROR 1 --- [xxx-inference] [io-32123-exec-7] o.a.s.r.d.exec.AbstractDMLBaseExecutor : execute executeAutoCommitTrue error:Global lock wait timeout org.apache.seata.rm.datasource.exec.LockWaitTimeoutException: Global lock wait timeout at org.apache.seata.rm.datasource.exec.LockRetryController.sleep(LockRetryController.java:66) ~[seata-all-2.1.0.jar!/:2.1.0] at org.apache.seata.rm.datasource.ConnectionProxy$LockRetryPolicy.doRetryOnLockConflict(ConnectionProxy.java:364) ~[seata-all-2.1.0.jar!/:2.1.0] at org.apache.seata.rm.datasource.exec.AbstractDMLBaseExecutor$LockRetryPolicy.execute(AbstractDMLBaseExecutor.java:188) ~[seata-all-2.1.0.jar!/:2.1.0]

错误代码示例

@GlobalTransactional
public void deletePod(PodBo podBo) {KubernetesClient kubernetesClient = k8SClientMgr.getConnect("", true);ModelServiceEntity modelServiceEntity = modelServiceMapper.selectById(podBo.getServiceId());if (modelServiceEntity == null) {throw new RuntimeException("模型服务不存在");}if (podBo.getServiceId() != null) {UpdateWrapper<ModelServiceEntity> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("id", podBo.getServiceId());updateWrapper.set("status", 1);modelServiceMapper.update(null, updateWrapper);// 远程调用删除任务inferenceTaskApi.deleteInferenceTask(Arrays.asList(modelServiceEntity.getInferenceTaskId().split(",")));}ResourceDefinitionContext context = new ResourceDefinitionContext.Builder().withGroup("kubeai.org").withVersion("v1").withPlural("models").withKind("Model").withNamespaced(true).build();// 删除 CRD 资源kubernetesClient.genericKubernetesResources(context).inNamespace(namespace).withName(podBo.getName().toLowerCase()).delete();
}

问题分析

// 这里查询了model_service表,seata会对model_service表进行加锁
ModelServiceEntity modelServiceEntity = modelServiceMapper.selectById(podBo.getServiceId());// 这里又进行了修改操作,由于前面已经加锁了,导致这里无法执行成功,进而超时
modelServiceMapper.update(null, updateWrapper);

问题解决

查询逻辑和更新逻辑不在一个事务里执行即可

public void deletePod(PodBo podBo) {KubernetesClient kubernetesClient = k8SClientMgr.getConnect("", true);ModelServiceEntity modelServiceEntity = modelServiceMapper.selectById(podBo.getServiceId());if (modelServiceEntity == null) {throw new RuntimeException("模型服务不存在");}deleteResource(kubernetesClient, podBo, modelServiceEntity);
}@GlobalTransactional
public void deleteResource(KubernetesClient kubernetesClient, PodBo podBo, ModelServiceEntity modelServiceEntity) {if (podBo.getServiceId() != null) {UpdateWrapper<ModelServiceEntity> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("id", podBo.getServiceId());updateWrapper.set("status", 1);modelServiceMapper.update(null, updateWrapper);// 远程调用删除任务inferenceTaskApi.deleteInferenceTask(Arrays.asList(modelServiceEntity.getInferenceTaskId().split(",")));}ResourceDefinitionContext context = new ResourceDefinitionContext.Builder().withGroup("kubeai.org").withVersion("v1").withPlural("models").withKind("Model").withNamespaced(true).build();// 删除 CRD 资源kubernetesClient.genericKubernetesResources(context).inNamespace(namespace).withName(podBo.getName().toLowerCase()).delete();
}

http://www.lryc.cn/news/619148.html

相关文章:

  • hashmap如何解决碰撞
  • JavaWeb从入门到精通!第二天!(Servlet)
  • 揭开Spectre漏洞的神秘面纱
  • 【后端】Spring @Resource和@Autowired的用法和区别
  • 告别数据孤岛!React 路由 3 种传参方法全解析
  • [Robotics_py] 定位滤波器 | 预测与更新 | 扩展卡尔曼滤波器(`EKF`)
  • 嵌入式学习 标准IO(完整版)
  • 浏览器面试题及详细答案 88道(12-22)
  • 【C#补全计划】StringBuilder
  • 【shell脚本编程】-4 shell脚本编写冒泡排序
  • C++11新增关键字和范围for循环
  • Flutter ExpansionPanel组件(可收缩的列表)
  • Qt中定时器介绍和使用
  • Gradle(二)Gradle的优势、项目结构介绍
  • python2操作neo4j
  • HTTPS加密与私有CA配置全攻略
  • spring-cloud整合nacos详细攻略
  • 读《精益数据分析》:UGC平台的数据指标梳理
  • 11-docker单机版的容器编排工具docker-compose基本使用
  • 数据分析专栏记录之 -基础数学与统计知识
  • Threejs 设置灯光照射点位置 辅助器不跟随移动
  • 大数据中的数据压缩原理
  • QT第五讲-控件QLineEdit、QSpinBox、QSlider、QScrollBar、QDial、QProgressBar、QLCDNumber
  • 计算机网络摘星题库800题笔记 第4章 网络层
  • 前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!笔记
  • MCU中的液晶显示屏LCD(Liquid Crystal Display)控制器
  • VUE的8个生命周期
  • C++list(2)
  • 【JavaEE】多线程之线程安全(上)
  • 串口通信学习