Skip to content

Commit 1186aba

Browse files
authored
bugfix: fix DM transaction rollback not using database auto-increment primary keys (apache#7643)
1 parent a09a474 commit 1186aba

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/dm/DmUndoDeleteExecutor.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.apache.seata.rm.datasource.sql.struct.TableRecords;
2424
import org.apache.seata.rm.datasource.undo.AbstractUndoExecutor;
2525
import org.apache.seata.rm.datasource.undo.SQLUndoLog;
26+
import org.apache.seata.sqlparser.struct.ColumnMeta;
27+
import org.apache.seata.sqlparser.struct.TableMeta;
2628
import org.apache.seata.sqlparser.util.ColumnUtils;
2729
import org.apache.seata.sqlparser.util.JdbcConstants;
2830

@@ -68,16 +70,39 @@ protected String buildUndoSQL() {
6870
.collect(Collectors.joining(", "));
6971
String insertValues = fields.stream().map(field -> "?").collect(Collectors.joining(", "));
7072

71-
return "SET IDENTITY_INSERT " + sqlUndoLog.getTableName()
72-
+ " ON; INSERT INTO "
73-
+ sqlUndoLog.getTableName()
74-
+ " ("
75-
+ insertColumns
76-
+ ") VALUES ("
77-
+ insertValues
78-
+ "); SET IDENTITY_INSERT "
79-
+ sqlUndoLog.getTableName()
80-
+ " OFF;";
73+
// Check if the table has an auto-increment primary key
74+
boolean hasAutoIncrement = false;
75+
TableMeta tableMeta = beforeImage.getTableMeta();
76+
if (tableMeta != null) {
77+
List<String> primaryKeys = tableMeta.getPrimaryKeyOnlyName();
78+
for (String pk : primaryKeys) {
79+
ColumnMeta columnMeta = tableMeta.getColumnMeta(pk);
80+
if (columnMeta != null && columnMeta.isAutoincrement()) {
81+
hasAutoIncrement = true;
82+
break;
83+
}
84+
}
85+
}
86+
if (hasAutoIncrement) {
87+
return "SET IDENTITY_INSERT " + sqlUndoLog.getTableName()
88+
+ " ON; INSERT INTO "
89+
+ sqlUndoLog.getTableName()
90+
+ " ("
91+
+ insertColumns
92+
+ ") VALUES ("
93+
+ insertValues
94+
+ "); SET IDENTITY_INSERT "
95+
+ sqlUndoLog.getTableName()
96+
+ " OFF;";
97+
} else {
98+
return " INSERT INTO " +
99+
sqlUndoLog.getTableName() +
100+
" (" +
101+
insertColumns +
102+
") VALUES (" +
103+
insertValues +
104+
");";
105+
}
81106
}
82107

83108
@Override

0 commit comments

Comments
 (0)