This is an automated email from the ASF dual-hosted git repository.

totalo 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 2cc05b5b7bc Refactor TransactionHook from TypedSPI to OrderedSPI 
(#32940)
2cc05b5b7bc is described below

commit 2cc05b5b7bce3bc27b016b66cb450d03075a0334
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Sep 21 00:25:15 2024 +0800

    Refactor TransactionHook from TypedSPI to OrderedSPI (#32940)
    
    * Refactor TransactionHook from TypedSPI to OrderedSPI
    
    * Refactor TransactionHook from TypedSPI to OrderedSPI
    
    * Refactor TransactionHook from TypedSPI to OrderedSPI
    
    * Refactor TransactionHook from TypedSPI to OrderedSPI
    
    * Refactor TransactionHook from TypedSPI to OrderedSPI
---
 .../executor/GlobalClockTransactionHook.java       | 86 +++++++++++-----------
 .../globalclock/rule/GlobalClockRule.java          | 48 +++---------
 .../rule/builder/GlobalClockRuleBuilder.java       |  2 +-
 .../transaction/spi/TransactionHook.java           | 45 ++++++++---
 .../connector/ProxyDatabaseConnectionManager.java  | 16 +++-
 .../proxy/backend/connector/ProxySQLExecutor.java  | 20 +++--
 .../transaction/BackendTransactionManager.java     | 41 +++++++----
 .../proxy/backend/context/ProxyContext.java        | 14 ++++
 .../ral/queryable/ExportMetaDataExecutor.java      |  3 +-
 .../transaction/BackendTransactionManagerTest.java |  2 +-
 .../ral/queryable/ExportMetaDataExecutorTest.java  |  5 +-
 ...DistVariableUpdatableRALBackendHandlerTest.java |  9 +++
 .../TransactionIsolationValueProviderTest.java     | 15 ++++
 .../TransactionReadOnlyValueProviderTest.java      | 15 ++++
 .../sysvar/provider/VersionValueProviderTest.java  | 15 ++++
 15 files changed, 211 insertions(+), 125 deletions(-)

diff --git 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
index 1a9a6ca5d8e..3e195df42f1 100644
--- 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
+++ 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
@@ -18,13 +18,14 @@
 package org.apache.shardingsphere.globalclock.executor;
 
 import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
+import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
+import org.apache.shardingsphere.globalclock.rule.constant.GlobalClockOrder;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.lock.GlobalLockNames;
 import org.apache.shardingsphere.infra.lock.LockContext;
 import org.apache.shardingsphere.infra.lock.LockDefinition;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.lock.GlobalLockDefinition;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
 import org.apache.shardingsphere.transaction.spi.TransactionHook;
@@ -33,97 +34,98 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Optional;
-import java.util.Properties;
 
 /**
  * Global clock transaction hook.
  */
-public final class GlobalClockTransactionHook implements TransactionHook {
+public final class GlobalClockTransactionHook implements 
TransactionHook<GlobalClockRule> {
     
     private final LockDefinition lockDefinition = new 
GlobalLockDefinition(GlobalLockNames.GLOBAL_LOCK.getLockName());
     
-    private boolean enabled;
-    
-    private GlobalClockTransactionExecutor globalClockTransactionExecutor;
-    
-    private GlobalClockProvider globalClockProvider;
-    
     @Override
-    public void init(final Properties props) {
-        DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, props.getProperty("trunkType"));
-        Optional<GlobalClockTransactionExecutor> 
globalClockTransactionExecutor = 
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class, 
databaseType);
-        if (!globalClockTransactionExecutor.isPresent()) {
-            return;
-        }
-        enabled = true;
-        this.globalClockTransactionExecutor = 
globalClockTransactionExecutor.get();
-        globalClockProvider = 
TypedSPILoader.getService(GlobalClockProvider.class, String.join(".", 
props.getProperty("type"), props.getProperty("provider")));
+    public void beforeBegin(final GlobalClockRule rule, final DatabaseType 
databaseType, final TransactionConnectionContext transactionContext) {
     }
     
     @Override
-    public void beforeBegin(final TransactionConnectionContext 
transactionContext) {
+    public void afterBegin(final GlobalClockRule rule, final DatabaseType 
databaseType, final TransactionConnectionContext transactionContext) {
+        rule.getGlobalClockProvider().ifPresent(optional -> 
transactionContext.setBeginMills(optional.getCurrentTimestamp()));
     }
     
     @Override
-    public void afterBegin(final TransactionConnectionContext 
transactionContext) {
-        if (!enabled) {
+    public void afterCreateConnections(final GlobalClockRule rule, final 
DatabaseType databaseType, final Collection<Connection> connections,
+                                       final TransactionConnectionContext 
transactionContext) throws SQLException {
+        if (!rule.getConfiguration().isEnabled()) {
             return;
         }
-        
transactionContext.setBeginMills(globalClockProvider.getCurrentTimestamp());
-    }
-    
-    @Override
-    public void afterCreateConnections(final Collection<Connection> 
connections, final TransactionConnectionContext transactionContext) throws 
SQLException {
-        if (!enabled) {
-            return;
+        Optional<GlobalClockTransactionExecutor> 
globalClockTransactionExecutor = 
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class, 
databaseType);
+        if (globalClockTransactionExecutor.isPresent()) {
+            
globalClockTransactionExecutor.get().sendSnapshotTimestamp(connections, 
transactionContext.getBeginMills());
         }
-        globalClockTransactionExecutor.sendSnapshotTimestamp(connections, 
transactionContext.getBeginMills());
     }
     
     @Override
-    public void beforeExecuteSQL(final Collection<Connection> connections, 
final TransactionConnectionContext connectionContext, final 
TransactionIsolationLevel isolationLevel) throws SQLException {
-        if (!enabled) {
+    public void beforeExecuteSQL(final GlobalClockRule rule, final 
DatabaseType databaseType, final Collection<Connection> connections, final 
TransactionConnectionContext connectionContext,
+                                 final TransactionIsolationLevel 
isolationLevel) throws SQLException {
+        if (!rule.getConfiguration().isEnabled()) {
             return;
         }
         if (null == isolationLevel || TransactionIsolationLevel.READ_COMMITTED 
== isolationLevel) {
-            globalClockTransactionExecutor.sendSnapshotTimestamp(connections, 
globalClockProvider.getCurrentTimestamp());
+            Optional<GlobalClockTransactionExecutor> 
globalClockTransactionExecutor = 
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class, 
databaseType);
+            Optional<GlobalClockProvider> globalClockProvider = 
rule.getGlobalClockProvider();
+            if (globalClockTransactionExecutor.isPresent() && 
globalClockProvider.isPresent()) {
+                
globalClockTransactionExecutor.get().sendSnapshotTimestamp(connections, 
globalClockProvider.get().getCurrentTimestamp());
+            }
         }
     }
     
     @Override
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public void beforeCommit(final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext, final LockContext lockContext) 
throws SQLException {
-        if (!enabled) {
+    public void beforeCommit(final GlobalClockRule rule, final DatabaseType 
databaseType, final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext,
+                             final LockContext lockContext) throws 
SQLException {
+        if (!rule.getConfiguration().isEnabled()) {
             return;
         }
         if (lockContext.tryLock(lockDefinition, 200L)) {
-            globalClockTransactionExecutor.sendCommitTimestamp(connections, 
globalClockProvider.getCurrentTimestamp());
+            Optional<GlobalClockTransactionExecutor> 
globalClockTransactionExecutor = 
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class, 
databaseType);
+            Optional<GlobalClockProvider> globalClockProvider = 
rule.getGlobalClockProvider();
+            if (globalClockTransactionExecutor.isPresent() && 
globalClockProvider.isPresent()) {
+                
globalClockTransactionExecutor.get().sendCommitTimestamp(connections, 
globalClockProvider.get().getCurrentTimestamp());
+            }
         }
     }
     
     @Override
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public void afterCommit(final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext, final LockContext lockContext) 
{
-        if (!enabled) {
+    public void afterCommit(final GlobalClockRule rule, final DatabaseType 
databaseType, final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext,
+                            final LockContext lockContext) {
+        Optional<GlobalClockProvider> globalClockProvider = 
rule.getGlobalClockProvider();
+        if (!globalClockProvider.isPresent()) {
             return;
         }
         try {
-            globalClockProvider.getNextTimestamp();
+            globalClockProvider.get().getNextTimestamp();
         } finally {
             lockContext.unlock(lockDefinition);
         }
     }
     
     @Override
-    public void beforeRollback(final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext) throws SQLException {
+    public void beforeRollback(final GlobalClockRule rule, final DatabaseType 
databaseType, final Collection<Connection> connections,
+                               final TransactionConnectionContext 
transactionContext) throws SQLException {
+    }
+    
+    @Override
+    public void afterRollback(final GlobalClockRule rule, final DatabaseType 
databaseType, final Collection<Connection> connections,
+                              final TransactionConnectionContext 
transactionContext) throws SQLException {
     }
     
     @Override
-    public void afterRollback(final Collection<Connection> connections, final 
TransactionConnectionContext transactionContext) throws SQLException {
+    public int getOrder() {
+        return GlobalClockOrder.ORDER;
     }
     
     @Override
-    public String getType() {
-        return "GLOBAL_CLOCK";
+    public Class<GlobalClockRule> getTypeClass() {
+        return GlobalClockRule.class;
     }
 }
diff --git 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
index 0bf2aeaf03e..a20512e8746 100644
--- 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
+++ 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
@@ -20,62 +20,34 @@ package org.apache.shardingsphere.globalclock.rule;
 import lombok.Getter;
 import 
org.apache.shardingsphere.globalclock.config.GlobalClockRuleConfiguration;
 import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
-import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.transaction.spi.TransactionHook;
 
-import java.util.Collection;
-import java.util.Map;
 import java.util.Optional;
-import java.util.Properties;
 
 /**
  * Global clock rule.
  */
+@Getter
 public final class GlobalClockRule implements GlobalRule {
     
-    @Getter
     private final GlobalClockRuleConfiguration configuration;
     
-    private final GlobalClockProvider provider;
+    private final GlobalClockProvider globalClockProvider;
     
-    public GlobalClockRule(final GlobalClockRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases) {
+    public GlobalClockRule(final GlobalClockRuleConfiguration ruleConfig) {
         configuration = ruleConfig;
-        if (ruleConfig.isEnabled()) {
-            provider = TypedSPILoader.getService(GlobalClockProvider.class, 
getGlobalClockProviderType(), configuration.getProps());
-            TypedSPILoader.getService(TransactionHook.class, "GLOBAL_CLOCK", 
createProperties(databases));
-        } else {
-            provider = null;
-        }
-    }
-    
-    private String getGlobalClockProviderType() {
-        return String.join(".", configuration.getType(), 
configuration.getProvider());
-    }
-    
-    private Properties createProperties(final Map<String, 
ShardingSphereDatabase> databases) {
-        Properties result = new Properties();
-        DatabaseType storageType = 
findStorageType(databases.values()).orElseGet(DatabaseTypeEngine::getDefaultStorageType);
-        result.setProperty("trunkType", 
storageType.getTrunkDatabaseType().orElse(storageType).getType());
-        result.setProperty("type", configuration.getType());
-        result.setProperty("provider", configuration.getProvider());
-        return result;
-    }
-    
-    private Optional<DatabaseType> findStorageType(final 
Collection<ShardingSphereDatabase> databases) {
-        return databases.stream().flatMap(each -> 
each.getResourceMetaData().getStorageUnits().values().stream()).findFirst().map(StorageUnit::getStorageType);
+        globalClockProvider = ruleConfig.isEnabled()
+                ? TypedSPILoader.getService(GlobalClockProvider.class, 
String.join(".", ruleConfig.getType(), ruleConfig.getProvider()), 
configuration.getProps())
+                : null;
     }
     
     /**
-     * Get current timestamp.
+     * Get global clock provider.
      *
-     * @return current timestamp
+     * @return global clock provider
      */
-    public long getCurrentTimestamp() {
-        return null == provider ? 0L : provider.getCurrentTimestamp();
+    public Optional<GlobalClockProvider> getGlobalClockProvider() {
+        return Optional.ofNullable(globalClockProvider);
     }
 }
diff --git 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
index f490549210a..79e9bba3e1e 100644
--- 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
+++ 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
@@ -33,7 +33,7 @@ public final class GlobalClockRuleBuilder implements 
GlobalRuleBuilder<GlobalClo
     
     @Override
     public GlobalClockRule build(final GlobalClockRuleConfiguration 
ruleConfig, final Map<String, ShardingSphereDatabase> databases, final 
ConfigurationProperties props) {
-        return new GlobalClockRule(ruleConfig, databases);
+        return new GlobalClockRule(ruleConfig);
     }
     
     @Override
diff --git 
a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
 
b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
index 43b60311236..656a4821397 100644
--- 
a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
+++ 
b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.transaction.spi;
 
-import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
 import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPI;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
 
 import java.sql.Connection;
@@ -29,80 +31,99 @@ import java.util.Collection;
 
 /**
  * ShardingSphere transaction hook.
+ * 
+ * @param <T> type of rule
  */
 @SingletonSPI
-public interface TransactionHook extends TypedSPI {
+public interface TransactionHook<T extends ShardingSphereRule> extends 
OrderedSPI<T> {
     
     /**
      * Process before opening the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param transactionContext transaction context
      */
-    void beforeBegin(TransactionConnectionContext transactionContext);
+    void beforeBegin(T rule, DatabaseType databaseType, 
TransactionConnectionContext transactionContext);
     
     /**
      * Process after opening the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param transactionContext transaction context
      */
-    void afterBegin(TransactionConnectionContext transactionContext);
+    void afterBegin(T rule, DatabaseType databaseType, 
TransactionConnectionContext transactionContext);
     
     /**
      * Process after connection is created.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @throws SQLException SQL exception
      */
-    void afterCreateConnections(Collection<Connection> connections, 
TransactionConnectionContext transactionContext) throws SQLException;
+    void afterCreateConnections(T rule, DatabaseType databaseType, 
Collection<Connection> connections, TransactionConnectionContext 
transactionContext) throws SQLException;
     
     /**
-     * Process before executing sql.
+     * Process before executing SQL.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @param isolationLevel isolation level
      * @throws SQLException SQL exception
      */
-    void beforeExecuteSQL(Collection<Connection> connections, 
TransactionConnectionContext transactionContext, TransactionIsolationLevel 
isolationLevel) throws SQLException;
+    void beforeExecuteSQL(T rule, DatabaseType databaseType, 
Collection<Connection> connections, TransactionConnectionContext 
transactionContext,
+                          TransactionIsolationLevel isolationLevel) throws 
SQLException;
     
     /**
      * Process before committing the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @param lockContext lock context
      * @throws SQLException SQL exception
      */
     @SuppressWarnings("rawtypes")
-    void beforeCommit(Collection<Connection> connections, 
TransactionConnectionContext transactionContext, LockContext lockContext) 
throws SQLException;
+    void beforeCommit(T rule, DatabaseType databaseType, 
Collection<Connection> connections, TransactionConnectionContext 
transactionContext, LockContext lockContext) throws SQLException;
     
     /**
      * Process after committing the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @param lockContext lock context
      * @throws SQLException SQL exception
      */
     @SuppressWarnings("rawtypes")
-    void afterCommit(Collection<Connection> connections, 
TransactionConnectionContext transactionContext, LockContext lockContext) 
throws SQLException;
+    void afterCommit(T rule, DatabaseType databaseType, Collection<Connection> 
connections, TransactionConnectionContext transactionContext, LockContext 
lockContext) throws SQLException;
     
     /**
      * Process before rolling back the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @throws SQLException SQL exception
      */
-    void beforeRollback(Collection<Connection> connections, 
TransactionConnectionContext transactionContext) throws SQLException;
+    void beforeRollback(T rule, DatabaseType databaseType, 
Collection<Connection> connections, TransactionConnectionContext 
transactionContext) throws SQLException;
     
     /**
      * Process after rolling back the transaction.
      *
+     * @param rule rule
+     * @param databaseType database type
      * @param connections connections
      * @param transactionContext transaction context
      * @throws SQLException SQL exception
      */
-    void afterRollback(Collection<Connection> connections, 
TransactionConnectionContext transactionContext) throws SQLException;
+    void afterRollback(T rule, DatabaseType databaseType, 
Collection<Connection> connections, TransactionConnectionContext 
transactionContext) throws SQLException;
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
index 81290d2003a..9ff69eb0ccd 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
@@ -22,9 +22,11 @@ import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DatabaseConnectionManager;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ConnectionPostProcessor;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ResourceLock;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager;
@@ -43,6 +45,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -67,7 +71,9 @@ public final class ProxyDatabaseConnectionManager implements 
DatabaseConnectionM
     
     private final AtomicBoolean closed = new AtomicBoolean(false);
     
-    private final Collection<TransactionHook> transactionHooks = 
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+    @SuppressWarnings("rawtypes")
+    private final Map<ShardingSphereRule, TransactionHook> transactionHooks = 
OrderedSPILoader.getServices(
+            TransactionHook.class, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
     
     @Override
     public List<Connection> getConnections(final String databaseName, final 
String dataSourceName, final int connectionOffset, final int connectionSize,
@@ -106,10 +112,12 @@ public final class ProxyDatabaseConnectionManager 
implements DatabaseConnectionM
         return databaseName.toLowerCase() + "." + dataSourceName;
     }
     
+    @SuppressWarnings({"unchecked", "rawtypes"})
     private void executeTransactionHooksAfterCreateConnections(final 
List<Connection> connections) throws SQLException {
         if (connectionSession.getTransactionStatus().isInTransaction()) {
-            for (TransactionHook each : transactionHooks) {
-                each.afterCreateConnections(connections, 
connectionSession.getConnectionContext().getTransactionContext());
+            DatabaseType databaseType = 
ProxyContext.getInstance().getDatabaseType();
+            for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+                entry.getValue().afterCreateConnections(entry.getKey(), 
databaseType, connections, 
connectionSession.getConnectionContext().getTransactionContext());
             }
         }
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
index 0e43235e9b1..332c2841186 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
@@ -46,7 +46,7 @@ import 
org.apache.shardingsphere.infra.rule.attribute.raw.RawExecutionRuleAttrib
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.executor.ProxyJDBCExecutor;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.statement.JDBCBackendStatement;
@@ -76,6 +76,8 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 
 /**
@@ -94,7 +96,9 @@ public final class ProxySQLExecutor {
     @Getter
     private final SQLFederationEngine sqlFederationEngine;
     
-    private final Collection<TransactionHook> transactionHooks = 
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+    @SuppressWarnings("rawtypes")
+    private final Map<ShardingSphereRule, TransactionHook> transactionHooks = 
OrderedSPILoader.getServices(
+            TransactionHook.class, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
     
     public ProxySQLExecutor(final String type, final 
ProxyDatabaseConnectionManager databaseConnectionManager, final 
DatabaseConnector databaseConnector, final QueryContext queryContext) {
         this.type = type;
@@ -105,9 +109,9 @@ public final class ProxySQLExecutor {
         regularExecutor = new ProxyJDBCExecutor(type, 
databaseConnectionManager.getConnectionSession(), databaseConnector, 
jdbcExecutor);
         rawExecutor = new RawExecutor(executorEngine, connectionContext);
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        String currentDatabaseName =
-                
Strings.isNullOrEmpty(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName())
 ? databaseConnectionManager.getConnectionSession().getUsedDatabaseName()
-                        : 
databaseConnectionManager.getConnectionSession().getCurrentDatabaseName();
+        String currentDatabaseName = 
Strings.isNullOrEmpty(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName())
+                ? 
databaseConnectionManager.getConnectionSession().getUsedDatabaseName()
+                : 
databaseConnectionManager.getConnectionSession().getCurrentDatabaseName();
         String currentSchemaName = 
getSchemaName(queryContext.getSqlStatementContext(), 
metaDataContexts.getMetaData().getDatabase(currentDatabaseName));
         sqlFederationEngine = new SQLFederationEngine(currentDatabaseName, 
currentSchemaName, metaDataContexts.getMetaData(), 
metaDataContexts.getStatistics(), jdbcExecutor);
     }
@@ -233,12 +237,14 @@ public final class ProxySQLExecutor {
         return regularExecutor.execute(executionContext.getQueryContext(), 
executionGroupContext, isReturnGeneratedKeys, isExceptionThrown);
     }
     
+    @SuppressWarnings({"unchecked", "rawtypes"})
     private void executeTransactionHooksBeforeExecuteSQL(final 
ConnectionSession connectionSession) throws SQLException {
         if (!getTransactionContext(connectionSession).isInTransaction()) {
             return;
         }
-        for (TransactionHook each : transactionHooks) {
-            
each.beforeExecuteSQL(connectionSession.getDatabaseConnectionManager().getCachedConnections().values(),
 getTransactionContext(connectionSession),
+        for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+            entry.getValue().beforeExecuteSQL(entry.getKey(), 
ProxyContext.getInstance().getDatabaseType(),
+                    
connectionSession.getDatabaseConnectionManager().getCachedConnections().values(),
 getTransactionContext(connectionSession),
                     
connectionSession.getIsolationLevel().orElse(TransactionIsolationLevel.READ_COMMITTED));
         }
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
index 73425a63dec..4cc7f78c3f6 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
@@ -17,8 +17,10 @@
 
 package org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction;
 
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import 
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager;
 import org.apache.shardingsphere.proxy.backend.connector.TransactionManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -35,10 +37,13 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * Backend transaction manager.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class BackendTransactionManager implements TransactionManager {
     
     private final ProxyDatabaseConnectionManager connection;
@@ -49,7 +54,7 @@ public final class BackendTransactionManager implements 
TransactionManager {
     
     private final ShardingSphereDistributionTransactionManager 
distributionTransactionManager;
     
-    private final Collection<TransactionHook> transactionHooks;
+    private final Map<ShardingSphereRule, TransactionHook> transactionHooks;
     
     public BackendTransactionManager(final ProxyDatabaseConnectionManager 
databaseConnectionManager) {
         connection = databaseConnectionManager;
@@ -58,7 +63,7 @@ public final class BackendTransactionManager implements 
TransactionManager {
         transactionType = transactionRule.getDefaultType();
         ShardingSphereTransactionManagerEngine engine = 
transactionRule.getResource();
         distributionTransactionManager = null == engine ? null : 
engine.getTransactionManager(transactionType);
-        transactionHooks = 
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+        transactionHooks = OrderedSPILoader.getServices(TransactionHook.class, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
     }
     
     @Override
@@ -69,23 +74,26 @@ public final class BackendTransactionManager implements 
TransactionManager {
             connection.closeHandlers(true);
             connection.closeConnections(false);
         }
-        for (TransactionHook each : transactionHooks) {
-            each.beforeBegin(getTransactionContext());
+        DatabaseType databaseType = 
ProxyContext.getInstance().getDatabaseType();
+        for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+            entry.getValue().beforeBegin(entry.getKey(), databaseType, 
getTransactionContext());
         }
         if (TransactionType.LOCAL == transactionType || null == 
distributionTransactionManager) {
             localTransactionManager.begin();
         } else {
             distributionTransactionManager.begin();
         }
-        for (TransactionHook each : transactionHooks) {
-            each.afterBegin(getTransactionContext());
+        for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+            entry.getValue().afterBegin(entry.getKey(), databaseType, 
getTransactionContext());
         }
     }
     
     @Override
     public void commit() throws SQLException {
-        for (TransactionHook each : transactionHooks) {
-            each.beforeCommit(connection.getCachedConnections().values(), 
getTransactionContext(), 
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
+        DatabaseType databaseType = 
ProxyContext.getInstance().getDatabaseType();
+        for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+            entry.getValue().beforeCommit(entry.getKey(), databaseType,
+                    connection.getCachedConnections().values(), 
getTransactionContext(), 
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
         }
         if 
(connection.getConnectionSession().getTransactionStatus().isInTransaction()) {
             try {
@@ -95,9 +103,9 @@ public final class BackendTransactionManager implements 
TransactionManager {
                     
distributionTransactionManager.commit(getTransactionContext().isExceptionOccur());
                 }
             } finally {
-                for (TransactionHook each : transactionHooks) {
-                    
each.afterCommit(connection.getCachedConnections().values(),
-                            getTransactionContext(), 
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
+                for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+                    entry.getValue().afterCommit(entry.getKey(), databaseType,
+                            connection.getCachedConnections().values(), 
getTransactionContext(), 
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
                 }
                 for (Connection each : 
connection.getCachedConnections().values()) {
                     
ConnectionSavepointManager.getInstance().transactionFinished(each);
@@ -110,8 +118,9 @@ public final class BackendTransactionManager implements 
TransactionManager {
     
     @Override
     public void rollback() throws SQLException {
-        for (TransactionHook each : transactionHooks) {
-            each.beforeRollback(connection.getCachedConnections().values(), 
getTransactionContext());
+        DatabaseType databaseType = 
ProxyContext.getInstance().getDatabaseType();
+        for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+            entry.getValue().beforeRollback(entry.getKey(), databaseType, 
connection.getCachedConnections().values(), getTransactionContext());
         }
         if 
(connection.getConnectionSession().getTransactionStatus().isInTransaction()) {
             try {
@@ -121,8 +130,8 @@ public final class BackendTransactionManager implements 
TransactionManager {
                     distributionTransactionManager.rollback();
                 }
             } finally {
-                for (TransactionHook each : transactionHooks) {
-                    
each.afterRollback(connection.getCachedConnections().values(), 
getTransactionContext());
+                for (Entry<ShardingSphereRule, TransactionHook> entry : 
transactionHooks.entrySet()) {
+                    entry.getValue().afterRollback(entry.getKey(), 
databaseType, connection.getCachedConnections().values(), 
getTransactionContext());
                 }
                 for (Connection each : 
connection.getCachedConnections().values()) {
                     
ConnectionSavepointManager.getInstance().transactionFinished(each);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
index d8eab13a62b..bf9c52cef91 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
@@ -20,7 +20,10 @@ package org.apache.shardingsphere.proxy.backend.context;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.state.instance.InstanceStateContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource;
@@ -87,4 +90,15 @@ public final class ProxyContext {
     public Optional<InstanceStateContext> getInstanceStateContext() {
         return null == contextManager.getComputeNodeInstanceContext() ? 
Optional.empty() : 
Optional.ofNullable(contextManager.getComputeNodeInstanceContext().getInstance().getState());
     }
+    
+    /**
+     * Get database type.
+     *
+     * @return database type
+     */
+    public DatabaseType getDatabaseType() {
+        Collection<ShardingSphereDatabase> databases = 
contextManager.getMetaDataContexts().getMetaData().getDatabases().values();
+        return databases.stream().flatMap(each -> 
each.getResourceMetaData().getStorageUnits().values().stream()).findFirst().map(StorageUnit::getStorageType)
+                .orElseGet(DatabaseTypeEngine::getDefaultStorageType);
+    }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
index dc038d9a6d8..669facdf74a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 import org.apache.commons.codec.binary.Base64;
 import 
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
 import 
org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportMetaDataStatement;
+import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
 import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
@@ -128,7 +129,7 @@ public final class ExportMetaDataExecutor implements 
DistSQLQueryExecutor<Export
         GlobalClockRule globalClockRule = 
metaData.getGlobalRuleMetaData().getSingleRule(GlobalClockRule.class);
         if (globalClockRule.getConfiguration().isEnabled()) {
             ExportedSnapshotInfo snapshotInfo = new ExportedSnapshotInfo();
-            
snapshotInfo.setCsn(String.valueOf(globalClockRule.getCurrentTimestamp()));
+            
snapshotInfo.setCsn(String.valueOf(globalClockRule.getGlobalClockProvider().map(GlobalClockProvider::getCurrentTimestamp).orElse(0L)));
             snapshotInfo.setCreateTime(LocalDateTime.now());
             exportedClusterInfo.setSnapshotInfo(snapshotInfo);
         }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
index 9c011012170..9ff5f8de1b3 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
@@ -195,7 +195,7 @@ class BackendTransactionManagerTest {
     
     @SneakyThrows(ReflectiveOperationException.class)
     private void setTransactionHooks() {
-        
Plugins.getMemberAccessor().set(BackendTransactionManager.class.getDeclaredField("transactionHooks"),
 backendTransactionManager, Collections.emptyList());
+        
Plugins.getMemberAccessor().set(BackendTransactionManager.class.getDeclaredField("transactionHooks"),
 backendTransactionManager, Collections.emptyMap());
     }
     
     private ContextManager mockContextManager(final TransactionType 
transactionType) {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
index f4bd3990e3e..b733fec5356 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
@@ -127,8 +127,7 @@ class ExportMetaDataExecutorTest {
     private ContextManager mockEmptyContextManager() {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(new HashMap<>(),
-                new ResourceMetaData(Collections.emptyMap()), new 
RuleMetaData(Collections.singletonList(
-                        new GlobalClockRule(new 
DefaultGlobalClockRuleConfigurationBuilder().build(), Collections.emptyMap()))),
+                new ResourceMetaData(Collections.emptyMap()), new 
RuleMetaData(Collections.singletonList(new GlobalClockRule(new 
DefaultGlobalClockRuleConfigurationBuilder().build()))),
                 new ConfigurationProperties(new Properties())));
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
         return result;
@@ -166,7 +165,7 @@ class ExportMetaDataExecutorTest {
         MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(Collections.singletonMap(database.getName(), database),
                 new ResourceMetaData(Collections.emptyMap()),
                 new RuleMetaData(Arrays.asList(new AuthorityRule(new 
DefaultAuthorityRuleConfigurationBuilder().build()),
-                        new GlobalClockRule(new 
DefaultGlobalClockRuleConfigurationBuilder().build(), 
Collections.singletonMap(database.getName(), database)))),
+                        new GlobalClockRule(new 
DefaultGlobalClockRuleConfigurationBuilder().build()))),
                 new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true")))));
         ComputeNodeInstanceContext computeNodeInstanceContext = new 
ComputeNodeInstanceContext(
                 new ComputeNodeInstance(mock(InstanceMetaData.class)), new 
StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null),
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
index 4c82ef2e409..6e236c9b28b 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
@@ -21,20 +21,29 @@ import io.netty.util.DefaultAttributeMap;
 import 
org.apache.shardingsphere.distsql.statement.ral.updatable.SetDistVariableStatement;
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.exception.kernel.syntax.UnsupportedVariableException;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.DistSQLUpdateBackendHandler;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
 class SetDistVariableUpdatableRALBackendHandlerTest {
     
     private ConnectionSession connectionSession;
     
     @BeforeEach
     void setUp() {
+        when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class, 
RETURNS_DEEP_STUBS));
         connectionSession = new 
ConnectionSession(mock(MySQLDatabaseType.class), new DefaultAttributeMap());
     }
     
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
index d5711f60b9b..b145831c38d 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
@@ -20,17 +20,32 @@ package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sys
 import io.netty.util.DefaultAttributeMap;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
 class TransactionIsolationValueProviderTest {
     
+    @BeforeEach
+    void setUp() {
+        when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class, 
RETURNS_DEEP_STUBS));
+    }
+    
     @Test
     void assertGetGlobalValue() {
         assertThat(new TransactionIsolationValueProvider().get(Scope.GLOBAL, 
null, MySQLSystemVariable.TRANSACTION_ISOLATION), is("REPEATABLE-READ"));
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
index 470b250542b..adebc2cf265 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
@@ -20,16 +20,31 @@ package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sys
 import io.netty.util.DefaultAttributeMap;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
 class TransactionReadOnlyValueProviderTest {
     
+    @BeforeEach
+    void setUp() {
+        when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class, 
RETURNS_DEEP_STUBS));
+    }
+    
     @Test
     void assertGetGlobalValue() {
         assertThat(new TransactionReadOnlyValueProvider().get(Scope.GLOBAL, 
null, MySQLSystemVariable.TX_READ_ONLY), is("0"));
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
index 593cd5d8f0d..7da19bde35a 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
@@ -21,18 +21,33 @@ import io.netty.util.DefaultAttributeMap;
 import 
org.apache.shardingsphere.db.protocol.constant.DatabaseProtocolServerInfo;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
 class VersionValueProviderTest {
     
+    @BeforeEach
+    void setUp() {
+        when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class, 
RETURNS_DEEP_STUBS));
+    }
+    
     @Test
     void assertGetValue() {
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "MySQL");

Reply via email to