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);