diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/MySQLMaxValueIncrementer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/MySQLMaxValueIncrementer.java index 0bd252a8143..541f0f5ac10 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/MySQLMaxValueIncrementer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/MySQLMaxValueIncrementer.java @@ -179,6 +179,7 @@ public class MySQLMaxValueIncrementer extends AbstractColumnMaxValueIncrementer } } catch (SQLException ignore) { + this.nextId = this.maxId; throw new DataAccessResourceFailureException( "Unable to commit new sequence value changes for " + getIncrementerName()); } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/support/incrementer/DataFieldMaxValueIncrementerTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/support/incrementer/DataFieldMaxValueIncrementerTests.java index b25c38084b2..ff33ec17818 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/support/incrementer/DataFieldMaxValueIncrementerTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/support/incrementer/DataFieldMaxValueIncrementerTests.java @@ -237,6 +237,34 @@ class DataFieldMaxValueIncrementerTests { verify(connection).close(); } + @Test + void mySQLMaxValueIncrementerWithCommitFailure() throws SQLException { + given(dataSource.getConnection()).willReturn(connection); + given(connection.createStatement()).willReturn(statement); + given(statement.executeQuery("select last_insert_id()")).willReturn(resultSet); + given(resultSet.next()).willReturn(true); + given(resultSet.getLong(1)).willReturn(2L, 2L, 4L); + willThrow(new SQLException("Cannot commit")).willDoNothing().given(connection).commit(); + + MySQLMaxValueIncrementer incrementer = new MySQLMaxValueIncrementer(); + incrementer.setDataSource(dataSource); + incrementer.setIncrementerName("myseq"); + incrementer.setColumnName("seq"); + incrementer.setCacheSize(2); + incrementer.afterPropertiesSet(); + + assertThatExceptionOfType(DataAccessResourceFailureException.class) + .isThrownBy(incrementer::nextLongValue); + assertThat(incrementer.nextLongValue()).isEqualTo(1); + assertThat(incrementer.nextLongValue()).isEqualTo(2); + assertThat(incrementer.nextLongValue()).isEqualTo(3); + assertThat(incrementer.nextLongValue()).isEqualTo(4); + + verify(dataSource, times(3)).getConnection(); + verify(statement, times(3)).executeUpdate("update myseq set seq = last_insert_id(seq + 2) limit 1"); + verify(connection, times(3)).commit(); + } + @Test void mariaDBSequenceMaxValueIncrementer() throws SQLException { given(dataSource.getConnection()).willReturn(connection);