From bb4a02d0f8935b32a223e5eaca0e2f385416b24c Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Sun, 12 Dec 2021 01:36:48 +0900 Subject: [PATCH] Add new option for force rollback on session close Fixes gh-2363 --- .../ibatis/builder/xml/XMLConfigBuilder.java | 1 + .../apache/ibatis/session/Configuration.java | 21 +++++++++++++++++++ .../session/defaults/DefaultSqlSession.java | 2 +- .../CustomizedSettingsMapperConfig.xml | 3 ++- .../ibatis/builder/XmlConfigBuilderTest.java | 2 ++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java index 6a0e1b9a58e..7b40a53ed66 100644 --- a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java +++ b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java @@ -270,6 +270,7 @@ private void settingsElement(Properties props) { configuration.setConfigurationFactory(resolveClass(props.getProperty("configurationFactory"))); configuration.setShrinkWhitespacesInSql(booleanValueOf(props.getProperty("shrinkWhitespacesInSql"), false)); configuration.setDefaultSqlProviderType(resolveClass(props.getProperty("defaultSqlProviderType"))); + configuration.setForceRollbackOnClose(booleanValueOf(props.getProperty("forceRollbackOnClose"), false)); } private void environmentsElement(XNode context) throws Exception { diff --git a/src/main/java/org/apache/ibatis/session/Configuration.java b/src/main/java/org/apache/ibatis/session/Configuration.java index 92585935892..f47d6b7cee7 100644 --- a/src/main/java/org/apache/ibatis/session/Configuration.java +++ b/src/main/java/org/apache/ibatis/session/Configuration.java @@ -114,6 +114,7 @@ public class Configuration { protected boolean useActualParamName = true; protected boolean returnInstanceForEmptyRow; protected boolean shrinkWhitespacesInSql; + protected boolean forceRollbackOnClose; protected String logPrefix; protected Class logImpl; @@ -297,6 +298,26 @@ public void setShrinkWhitespacesInSql(boolean shrinkWhitespacesInSql) { this.shrinkWhitespacesInSql = shrinkWhitespacesInSql; } + /** + * Whether force rollback on session close. + * + * @return if return {@code true}, execute force rollback + * @since 3.5.8 + */ + public boolean isForceRollbackOnClose() { + return forceRollbackOnClose; + } + + /** + * Set whether force rollback on session close. + * + * @param forceRollbackOnClose if set {@code true}, execute force rollback + * @since 3.5.8 + */ + public void setForceRollbackOnClose(boolean forceRollbackOnClose) { + this.forceRollbackOnClose = forceRollbackOnClose; + } + public String getDatabaseId() { return databaseId; } diff --git a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java index 5b95f84a79b..85b425b8602 100644 --- a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java +++ b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java @@ -257,7 +257,7 @@ public List flushStatements() { @Override public void close() { try { - executor.close(isCommitOrRollbackRequired(false)); + executor.close(isCommitOrRollbackRequired(configuration.isForceRollbackOnClose())); closeCursors(); dirty = false; } finally { diff --git a/src/test/java/org/apache/ibatis/builder/CustomizedSettingsMapperConfig.xml b/src/test/java/org/apache/ibatis/builder/CustomizedSettingsMapperConfig.xml index fce0aeb1474..3920549b0fe 100644 --- a/src/test/java/org/apache/ibatis/builder/CustomizedSettingsMapperConfig.xml +++ b/src/test/java/org/apache/ibatis/builder/CustomizedSettingsMapperConfig.xml @@ -1,7 +1,7 @@