From 4388fb151e46ee4c8c405b8730a6cfac45c53934 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Sat, 14 Dec 2024 10:04:01 +0800 Subject: [PATCH] =?UTF-8?q?opt:=20=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=97=B6=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E4=B8=8D=E6=96=AD?= =?UTF-8?q?=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/nl/wms/util/TaskUtils.java | 15 ++++-- .../src/test/java/org/nl/ApplicationTest.java | 53 +++++++++++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java index de5d85f55..da2677ce5 100644 --- a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java +++ b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java @@ -44,30 +44,35 @@ public class TaskUtils { * @param function */ @SneakyThrows - public static void taskLock(String code, Runnable function){ + public static void taskLock(String code, Runnable function) { RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class); RLock lock = redissonClient.getLock(code); boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); + PlatformTransactionManager txManager = SpringContextHolder.getBean(PlatformTransactionManager.class); + TransactionStatus status = null; try { if (tryLock) { - PlatformTransactionManager txManager = SpringContextHolder.getBean(PlatformTransactionManager.class); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - TransactionStatus status = txManager.getTransaction(def); + status = txManager.getTransaction(def); - //执行目标方法 + // 执行目标方法 function.run(); txManager.commit(status); } else { throw new BadRequestException("其他设备占用锁,等待结束!"); } + } catch (Exception e) { + if (status != null) { + txManager.rollback(status); + } + throw e; // 重新抛出异常以便调用者处理 } finally { if (tryLock) { lock.unlock(); } } - } public static void setCreateByAcs(SchBaseTask taskObj) { diff --git a/lms2/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java b/lms2/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java index f866bad01..7af90c3e3 100644 --- a/lms2/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java +++ b/lms2/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java @@ -1,12 +1,24 @@ package org.nl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; +import lombok.SneakyThrows; import org.junit.jupiter.api.Test; +import org.nl.common.exception.BadRequestException; +import org.nl.config.SpringContextHolder; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.util.TaskUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * @Author: lyd @@ -16,6 +28,9 @@ import java.util.Map; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class ApplicationTest { + @Resource + private ISchBasePointService schBasePointService; + @Test void contextLoads() { } @@ -38,4 +53,42 @@ public class ApplicationTest { } } + @Test + void testSQLException() throws InterruptedException { + for (int i = 0; i < 100; i++) { + new Thread(this::doExec).start(); + Thread.sleep(1000); + } + } + + @Transactional(rollbackFor = Exception.class) + void doExec() { + TaskUtils.taskLock("sss", () -> { + SchBasePoint byId = schBasePointService.getById("100896325655"); + if (ObjectUtil.isEmpty(byId)) { + throw new BadRequestException("sss-1"); + } + }); + } + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + void doExec2() { + RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class); + RLock lock = redissonClient.getLock("sss"); + boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); + try { + if (tryLock) { + SchBasePoint byId = schBasePointService.getById("100896325655"); + if (ObjectUtil.isEmpty(byId)) { + throw new BadRequestException("sss-1"); + } + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + + } + }