From 46a5de95cb461b6dedf7d88ab5f0da0406782d29 Mon Sep 17 00:00:00 2001 From: godotg Date: Thu, 8 Sep 2022 11:32:40 +0800 Subject: [PATCH] =?UTF-8?q?fix[orm]:=20=E4=BF=AE=E5=A4=8D=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=B9=B6=E5=8F=91=E6=9B=B4=E6=96=B0=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E5=8F=AA=E5=9C=A8update=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E8=AE=B0=E5=BD=95=E7=BA=BF=E7=A8=8B=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/orm/model/cache/EntityCaches.java | 18 +++++++++++++++--- .../com/zfoo/orm/model/persister/PNode.java | 2 -- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java b/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java index 96e5c68d..829d6c2e 100644 --- a/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java +++ b/orm/src/main/java/com/zfoo/orm/model/cache/EntityCaches.java @@ -28,6 +28,7 @@ import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.StringUtils; import com.zfoo.scheduler.util.TimeUtils; +import com.zfoo.util.ThreadUtils; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.slf4j.Logger; @@ -143,9 +144,20 @@ public class EntityCaches, E extends IEntity> impl cache.put(entity.id(), currentPnode); } - if (currentPnode.getThreadId() != Thread.currentThread().getId()) { - logger.error("[{} id:{}]被多线程访问了,先后2次访问线程id分别是[{}][{}]", entity.getClass().getSimpleName(), entity.id(), - currentPnode.getThreadId(), Thread.currentThread().getId()); + var pnodeThreadId = currentPnode.getThreadId(); + var currentThreadId = Thread.currentThread().getId(); + if (pnodeThreadId != currentThreadId) { + if (pnodeThreadId == 0) { + currentPnode.setThreadId(currentThreadId); + } else { + var pnodeThread = ThreadUtils.findThread(pnodeThreadId); + if (pnodeThread == null) { + logger.warn("[{}][id:{}]有并发写风险,第一次更新的线程[id:{}],第2次更新的线程[id:{}]", entity.getClass().getSimpleName(), entity.id(), pnodeThreadId, currentThreadId); + } else { + logger.warn("[{}][id:{}]有并发写风险,第一次更新的线程[id:{}][name:{}],第2次更新的线程[id:{}][name:{}]" + , entity.getClass().getSimpleName(), entity.id(), pnodeThreadId, pnodeThread.getName(), currentThreadId, Thread.currentThread().getName()); + } + } } // 加100以防止,立刻加载并且立刻修改数据的情况发生时,服务器取到的时间戳相同 diff --git a/orm/src/main/java/com/zfoo/orm/model/persister/PNode.java b/orm/src/main/java/com/zfoo/orm/model/persister/PNode.java index cf4108ec..fe431f9c 100644 --- a/orm/src/main/java/com/zfoo/orm/model/persister/PNode.java +++ b/orm/src/main/java/com/zfoo/orm/model/persister/PNode.java @@ -42,8 +42,6 @@ public class PNode> { var currentTime = TimeUtils.now(); this.writeToDbTime = currentTime; this.modifiedTime = currentTime; - - this.threadId = Thread.currentThread().getId(); } public E getEntity() {