diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/AbstractDMLBaseExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/AbstractDMLBaseExecutor.java
index 6e57b5a3c7933029d352fd741936a8cc751f3117..7ebcfae9b021491e1f05084f3a04c8cadf6a4acd 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/AbstractDMLBaseExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/AbstractDMLBaseExecutor.java
@@ -26,7 +26,6 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import io.seata.common.exception.NotSupportYetException;
-import io.seata.common.exception.ShouldNeverHappenException;
 import io.seata.common.util.CollectionUtils;
 import io.seata.rm.datasource.AbstractConnectionProxy;
 import io.seata.rm.datasource.ConnectionContext;
@@ -35,7 +34,6 @@ import io.seata.rm.datasource.StatementProxy;
 import io.seata.rm.datasource.sql.struct.TableRecords;
 import io.seata.sqlparser.SQLRecognizer;
 import io.seata.sqlparser.util.JdbcConstants;
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -202,13 +200,4 @@ public abstract class AbstractDMLBaseExecutor<T, S extends Statement> extends Ba
             return LOCK_RETRY_POLICY_BRANCH_ROLLBACK_ON_CONFLICT;
         }
     }
-
-    protected void assertContainsPKColumnName(List<String> updateColumns) {
-        for (String columnName : updateColumns) {
-            String standardColumnName = getStandardPkColumnName(columnName);
-            if (StringUtils.isNotEmpty(standardColumnName)) {
-                throw new ShouldNeverHappenException("Sorry, update pk value is not supported!");
-            }
-        }
-    }
 }
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
index fcec010c35a9c7f5671b8c7703a07a1cac20c78b..fdc35a38048be5bf07f4c799f526ba4a6b1ceeb9 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
@@ -22,6 +22,7 @@ import java.sql.Statement;
 import java.util.Map;
 import java.util.Objects;
 
+import io.seata.common.exception.ShouldNeverHappenException;
 import io.seata.common.util.CollectionUtils;
 import io.seata.common.util.IOUtil;
 import io.seata.common.util.StringUtils;
@@ -269,7 +270,11 @@ public abstract class BaseTransactionalExecutor<T, S extends Statement> implemen
         if (beforeImage.getRows().isEmpty() && afterImage.getRows().isEmpty()) {
             return;
         }
-
+        if (SQLType.UPDATE == sqlRecognizer.getSQLType()) {
+            if (beforeImage.getRows().size() != afterImage.getRows().size()) {
+                throw new ShouldNeverHappenException("Before image size is not equaled to after image size, probably because you updated the primary keys.");
+            }
+        }
         ConnectionProxy connectionProxy = statementProxy.getConnectionProxy();
 
         TableRecords lockKeyRecords = sqlRecognizer.getSQLType() == SQLType.DELETE ? beforeImage : afterImage;
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiExecutor.java
index 434ac9415cab4afd3b6e6588849e5b5fe7f2d1ae..228c4dc1f2f76fe1a242fe4d712c3ef800342df9 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiExecutor.java
@@ -16,9 +16,11 @@
 package io.seata.rm.datasource.exec;
 
 
+import io.seata.common.exception.ShouldNeverHappenException;
 import io.seata.rm.datasource.StatementProxy;
 import io.seata.rm.datasource.sql.struct.TableRecords;
 import io.seata.sqlparser.SQLRecognizer;
+import io.seata.sqlparser.SQLType;
 
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -116,6 +118,11 @@ public class MultiExecutor<T, S extends Statement> extends AbstractDMLBaseExecut
             sqlRecognizer = recognizer = entry.getKey();
             beforeImage = entry.getValue();
             afterImage = afterImagesMap.get(recognizer);
+            if (SQLType.UPDATE == sqlRecognizer.getSQLType()) {
+                if (beforeImage.getRows().size() != afterImage.getRows().size()) {
+                    throw new ShouldNeverHappenException("Before image size is not equaled to after image size, probably because you updated the primary keys.");
+                }
+            }
             super.prepareUndoLog(beforeImage, afterImage);
         }
     }
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
index 9ecd1eab0e94e2bee939dbeb2e46cc1134131274..13101f3a3299dc3c4cca1434a3c844b9466f2ee4 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
@@ -80,7 +80,6 @@ public class MultiUpdateExecutor<T, S extends Statement> extends AbstractDMLBase
             sqlRecognizer = recognizer;
             SQLUpdateRecognizer sqlUpdateRecognizer = (SQLUpdateRecognizer) recognizer;
             List<String> updateColumns = sqlUpdateRecognizer.getUpdateColumns();
-            assertContainsPKColumnName(updateColumns);
             updateColumnsSet.addAll(updateColumns);
             if (noWhereCondition) {
                 continue;
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
index e2b39b3cf0220eb4e814bc1b33015db5375b01de..a6ba5ac90efb409cb07cc37680c02cc9a25a355b 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
@@ -75,7 +75,6 @@ public class UpdateExecutor<T, S extends Statement> extends AbstractDMLBaseExecu
     private String buildBeforeImageSQL(TableMeta tableMeta, ArrayList<List<Object>> paramAppenderList) {
         SQLUpdateRecognizer recognizer = (SQLUpdateRecognizer) sqlRecognizer;
         List<String> updateColumns = recognizer.getUpdateColumns();
-        assertContainsPKColumnName(updateColumns);
         StringBuilder prefix = new StringBuilder("SELECT ");
         StringBuilder suffix = new StringBuilder(" FROM ").append(getFromTableInSQL());
         String whereCondition = buildWhereCondition(recognizer, paramAppenderList);