diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/InsertExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/InsertExecutor.java index c26dd7b660f..ac3130f3f17 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/InsertExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/InsertExecutor.java @@ -25,6 +25,8 @@ import io.seata.rm.datasource.sql.struct.Null; import io.seata.rm.datasource.sql.struct.TableMeta; import io.seata.rm.datasource.sql.struct.TableRecords; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -45,6 +47,7 @@ */ public class InsertExecutor extends AbstractDMLBaseExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(InsertExecutor.class); protected static final String ERR_SQL_STATE = "S1009"; /** @@ -135,6 +138,7 @@ protected List getPkValuesByAuto() throws SQLException { // specify Statement.RETURN_GENERATED_KEYS to // Statement.executeUpdate() or Connection.prepareStatement(). if (ERR_SQL_STATE.equalsIgnoreCase(e.getSQLState())) { + LOGGER.warn("Fail to get auto-generated keys, use \'SELECT LAST_INSERT_ID()\' instead. Be cautious, statement could be polluted. Recommend you set the statement to return generated keys."); genKeys = statementProxy.getTargetStatement().executeQuery("SELECT LAST_INSERT_ID()"); } else { throw e; diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/InsertExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/InsertExecutorTest.java index beb7c5ca793..0aacce0edd6 100644 --- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/InsertExecutorTest.java +++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/InsertExecutorTest.java @@ -218,6 +218,23 @@ public void testGetPkValuesByAuto_SQLException() { }); } + @Test + public void testGetPkValuesByAuto_SQLException_WarnLog() throws SQLException { + doReturn(tableMeta).when(insertExecutor).getTableMeta(); + ColumnMeta columnMeta = mock(ColumnMeta.class); + Map columnMetaMap = new HashMap<>(); + columnMetaMap.put(ID_COLUMN, columnMeta); + when(columnMeta.isAutoincrement()).thenReturn(true); + when(tableMeta.getPrimaryKeyMap()).thenReturn(columnMetaMap); + PreparedStatement preparedStatement = mock(PreparedStatement.class); + when(statementProxy.getTargetStatement()).thenReturn(preparedStatement); + SQLException e = new SQLException("test warn log", InsertExecutor.ERR_SQL_STATE, 1); + when(preparedStatement.getGeneratedKeys()).thenThrow(e); + ResultSet genKeys = mock(ResultSet.class); + when(statementProxy.getTargetStatement().executeQuery("SELECT LAST_INSERT_ID()")).thenReturn(genKeys); + Assertions.assertTrue(insertExecutor.getPkValuesByAuto().isEmpty()); + } + @Test public void testGetPkValuesByAuto_GeneratedKeys_NoResult() throws SQLException { doReturn(tableMeta).when(insertExecutor).getTableMeta();