This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 34bee151d38 Add default isolation level for databases (#35388) 34bee151d38 is described below commit 34bee151d3891541d7ddf8744d76bd37f588273f Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Wed May 14 00:44:15 2025 +0800 Add default isolation level for databases (#35388) - Add default isolation level to DialectTransactionOption - Update getTransactionOption() for Firebird, MySQL, OpenGauss, and PostgreSQL - Modify SetTransactionHandler to use default isolation level based on database type --- .../metadata/database/metadata/DialectDatabaseMetaData.java | 3 ++- .../metadata/option/transaction/DialectTransactionOption.java | 2 ++ .../firebird/metadata/database/FirebirdDatabaseMetaData.java | 4 +++- .../mysql/metadata/database/MySQLDatabaseMetaData.java | 4 +++- .../opengauss/metadata/database/OpenGaussDatabaseMetaData.java | 3 ++- .../metadata/database/PostgreSQLDatabaseMetaData.java | 4 +++- .../proxy/backend/handler/tcl/SetTransactionHandler.java | 10 ++++------ 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java index 4565aa4e6cf..08df94ead55 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java @@ -34,6 +34,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.metadata. import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI; import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; +import java.sql.Connection; import java.util.Optional; /** @@ -124,7 +125,7 @@ public interface DialectDatabaseMetaData extends DatabaseTypedSPI { * @return transaction option */ default DialectTransactionOption getTransactionOption() { - return new DialectTransactionOption(false, false, false, false, true); + return new DialectTransactionOption(false, false, false, false, true, Connection.TRANSACTION_READ_COMMITTED); } /** diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java index 23b2b66f559..833e3473998 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java @@ -37,4 +37,6 @@ public final class DialectTransactionOption { // TODO Investgate the reason of some databases cannot support meta data refreshed in transaction. The method should be removed finally after metadata refresh supported for all database. private final boolean isSupportMetaDataRefreshInTransaction; + + private final int defaultIsolationLevel; } diff --git a/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java b/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java index 598ce4b3e97..8d2d4261ddc 100644 --- a/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java +++ b/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java @@ -23,6 +23,8 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.metadata. import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.IdentifierPatternType; import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction.DialectTransactionOption; +import java.sql.Connection; + /** * Database metadata of Firebird. */ @@ -45,7 +47,7 @@ public final class FirebirdDatabaseMetaData implements DialectDatabaseMetaData { @Override public DialectTransactionOption getTransactionOption() { - return new DialectTransactionOption(false, true, false, false, true); + return new DialectTransactionOption(false, true, false, false, true, Connection.TRANSACTION_READ_COMMITTED); } @Override diff --git a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java index c8e8b674770..436a7dc0eb5 100644 --- a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java +++ b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java @@ -28,6 +28,8 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.metadata. import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction.DialectTransactionOption; import org.apache.shardingsphere.infra.database.mysql.metadata.database.option.MySQLDataTypeOption; +import java.sql.Connection; + /** * Database meta data of MySQL. */ @@ -65,7 +67,7 @@ public final class MySQLDatabaseMetaData implements DialectDatabaseMetaData { @Override public DialectTransactionOption getTransactionOption() { - return new DialectTransactionOption(false, false, true, false, true); + return new DialectTransactionOption(false, false, true, false, true, Connection.TRANSACTION_REPEATABLE_READ); } @Override diff --git a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java index 8f03e8f1b74..4c3dffb0909 100644 --- a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java +++ b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java @@ -30,6 +30,7 @@ import org.apache.shardingsphere.infra.database.opengauss.metadata.database.opti import org.apache.shardingsphere.infra.database.opengauss.metadata.database.option.OpenGaussDriverQuerySystemCatalogOption; import org.apache.shardingsphere.infra.database.opengauss.metadata.database.option.OpenGaussSchemaOption; +import java.sql.Connection; import java.util.Optional; /** @@ -74,7 +75,7 @@ public final class OpenGaussDatabaseMetaData implements DialectDatabaseMetaData @Override public DialectTransactionOption getTransactionOption() { - return new DialectTransactionOption(true, false, false, true, false); + return new DialectTransactionOption(true, false, false, true, false, Connection.TRANSACTION_READ_COMMITTED); } @Override diff --git a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java index eff476240ec..548550ddddd 100644 --- a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java +++ b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java @@ -28,6 +28,8 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.metadata. import org.apache.shardingsphere.infra.database.postgresql.metadata.database.option.PostgreSQLDataTypeOption; import org.apache.shardingsphere.infra.database.postgresql.metadata.database.option.PostgreSQLSchemaOption; +import java.sql.Connection; + /** * Database meta data of PostgreSQL. */ @@ -65,7 +67,7 @@ public final class PostgreSQLDatabaseMetaData implements DialectDatabaseMetaData @Override public DialectTransactionOption getTransactionOption() { - return new DialectTransactionOption(false, false, false, true, false); + return new DialectTransactionOption(false, false, false, true, false, Connection.TRANSACTION_READ_COMMITTED); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java index 5954181d37a..a938ea4f74e 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java @@ -18,6 +18,8 @@ package org.apache.shardingsphere.proxy.backend.handler.tcl; import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction.DialectTransactionOption; +import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler; import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader; @@ -26,11 +28,8 @@ import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.proxy.backend.util.TransactionUtils; import org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionAccessType; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SetTransactionStatement; -import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; import org.apache.shardingsphere.transaction.exception.SwitchTypeInTransactionException; -import java.sql.Connection; - /** * Transaction set handler. */ @@ -64,9 +63,8 @@ public final class SetTransactionHandler implements ProxyBackendHandler { if (!sqlStatement.getIsolationLevel().isPresent()) { return; } - connectionSession.setDefaultIsolationLevel(sqlStatement instanceof MySQLStatement - ? TransactionUtils.getTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ) - : TransactionUtils.getTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED)); + DialectTransactionOption transactionOption = new DatabaseTypeRegistry(sqlStatement.getDatabaseType()).getDialectDatabaseMetaData().getTransactionOption(); + connectionSession.setDefaultIsolationLevel(TransactionUtils.getTransactionIsolationLevel(transactionOption.getDefaultIsolationLevel())); connectionSession.setIsolationLevel(sqlStatement.getIsolationLevel().get()); } }