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());
     }
 }

Reply via email to