You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/06/21 04:53:14 UTC

[shardingsphere] branch master updated: Simplify distributed lock remove useless code (#18472)

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

zhaojinchao 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 edc55ad70fb Simplify distributed lock remove useless code  (#18472)
edc55ad70fb is described below

commit edc55ad70fbdc31102a7ef0ec6ec645f30dcb5f7
Author: gin <ja...@163.com>
AuthorDate: Tue Jun 21 12:53:07 2022 +0800

    Simplify distributed lock remove useless code  (#18472)
    
    * Simplify distributed lock code
    
    * Add table lock node type
    
    * Simplify lock context
---
 .../shardingsphere/infra/lock/LockContext.java     | 74 +++---------------
 .../infra/lock/{LockType.java => LockLevel.java}   |  6 +-
 .../{LockType.java => LockNameDefinition.java}     | 18 ++++-
 .../core/api/impl/RuleAlteredJobAPIImpl.java       | 13 ++--
 .../scenario/rulealtered/RuleAlteredJobWorker.java |  7 +-
 .../mode/manager/lock/AbstractLockContext.java     | 90 ++++++++++++++++++++++
 .../lock/ShardingSphereLockJudgeEngine.java        |  3 +-
 .../definition/DatabaseLockNameDefinition.java     | 20 ++++-
 .../LockNameDefinitionFactory.java}                | 28 ++++---
 .../manager/lock/AbstractLockJudgeEngineTest.java  | 50 ++++++++++++
 .../lock/ShardingSphereLockJudgeEngineTest.java    | 84 --------------------
 .../coordinator/lock/DistributedLockContext.java   | 44 +++--------
 .../lock/manager/ShardingSphereLockManager.java    | 48 ------------
 .../lock/manager/state/LockStateContext.java       | 41 ----------
 .../coordinator/lock/util/LockNodeType.java        |  2 +-
 .../lock/DistributedLockContextTest.java           |  5 +-
 .../manager/memory/lock/MemoryLockContext.java     | 22 +++---
 .../standalone/lock/StandaloneLockContext.java     | 22 +++---
 .../text/distsql/DistSQLBackendHandlerFactory.java |  5 +-
 19 files changed, 255 insertions(+), 327 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java
index d22680e6d50..3ff0d405d08 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.lock;
 
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 
-import java.util.Set;
-
 /**
  * Lock context.
  */
@@ -42,82 +40,34 @@ public interface LockContext {
     ShardingSphereLock getLock();
     
     /**
-     * Try lock for database.
-     *
-     * @param databaseName database name
-     * @param lockMode lock mode
-     * @return is locked or not
-     */
-    boolean tryLock(String databaseName, LockMode lockMode);
-    
-    /**
-     * Try Lock write for database.
-     *
-     * @param databaseName database name
-     * @param lockMode lock mode
-     * @param timeoutMilliseconds timeout milliseconds
-     * @return is locked or not
-     */
-    boolean tryLock(String databaseName, LockMode lockMode, long timeoutMilliseconds);
-    
-    /**
-     * Try lock for schemas.
+     * Try lock.
      *
-     * @param databaseName database name
-     * @param schemaNames schema names
-     * @param lockMode lock mode
+     * @param lockNameDefinition lock name definition
      * @return is locked or not
      */
-    default boolean tryLock(String databaseName, Set<String> schemaNames, LockMode lockMode) {
-        throw new UnsupportedOperationException();
-    }
+    boolean tryLock(LockNameDefinition lockNameDefinition);
     
     /**
-     * Try lock for schemas.
+     * Try Lock.
      *
-     * @param databaseName database name
-     * @param schemaNames schema names
-     * @param lockMode lock mode
+     * @param lockNameDefinition lock name definition
      * @param timeoutMilliseconds timeout milliseconds
      * @return is locked or not
      */
-    default boolean tryLock(String databaseName, Set<String> schemaNames, LockMode lockMode, long timeoutMilliseconds) {
-        throw new UnsupportedOperationException();
-    }
-    
-    /**
-     * Release lock for database.
-     *
-     * @param databaseName database name
-     */
-    void releaseLock(String databaseName);
+    boolean tryLock(LockNameDefinition lockNameDefinition, long timeoutMilliseconds);
     
     /**
-     * Release lock write for schemas.
+     * Release lock.
      *
-     * @param databaseName database name
-     * @param schemaName schema name
+     * @param lockNameDefinition lock name definition
      */
-    default void releaseLock(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
-    
-    /**
-     *  Is locked database.
-     *
-     * @param databaseName database name
-     * @return is locked database or not
-     */
-    boolean isLocked(String databaseName);
+    void releaseLock(LockNameDefinition lockNameDefinition);
     
     /**
-     * Is locked schema.
+     *  Is locked.
      *
-     * @param databaseName database name
-     * @param schemaName schema name
+     * @param lockNameDefinition lock name definition
      * @return is locked or not
      */
-    default boolean isLocked(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
+    boolean isLocked(LockNameDefinition lockNameDefinition);
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockLevel.java
similarity index 91%
copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockLevel.java
index 94ec1a973a5..47eba392212 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockLevel.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.infra.lock;
 
 /**
- * Lock type.
+ * Lock level.
  */
-public enum LockType {
+public enum LockLevel {
     
-    STANDARD, GENERAL, DATABASE, SCHEMA
+    DATABASE, SCHEMA, TABLE
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockNameDefinition.java
similarity index 76%
copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockNameDefinition.java
index 94ec1a973a5..f06210fbeb6 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockNameDefinition.java
@@ -18,9 +18,21 @@
 package org.apache.shardingsphere.infra.lock;
 
 /**
- * Lock type.
+ * Lock name definition.
  */
-public enum LockType {
+public interface LockNameDefinition {
     
-    STANDARD, GENERAL, DATABASE, SCHEMA
+    /**
+     * Get lock mode.
+     *
+     * @return lock mode
+     */
+    LockMode getLockMode();
+    
+    /**
+     * Get lock level.
+     *
+     * @return lock level
+     */
+    LockLevel getLockLevel();
 }
diff --git a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/api/impl/RuleAlteredJobAPIImpl.java b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/api/impl/RuleAlteredJobAPIImpl.java
index 13e9cb09742..03a755a9986 100644
--- a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/api/impl/RuleAlteredJobAPIImpl.java
+++ b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/api/impl/RuleAlteredJobAPIImpl.java
@@ -48,9 +48,10 @@ import org.apache.shardingsphere.elasticjob.lite.lifecycle.domain.JobBriefInfo;
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.lock.LockContext;
-import org.apache.shardingsphere.infra.lock.LockMode;
+import org.apache.shardingsphere.infra.lock.LockNameDefinition;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.ScalingTaskFinishedEvent;
+import org.apache.shardingsphere.mode.manager.lock.definition.LockNameDefinitionFactory;
 import org.apache.shardingsphere.scaling.core.job.environment.ScalingEnvironmentManager;
 
 import java.sql.SQLException;
@@ -178,11 +179,12 @@ public final class RuleAlteredJobAPIImpl extends AbstractPipelineJobAPIImpl impl
     @Override
     public void stopClusterWriteDB(final String databaseName, final String jobId) {
         LockContext lockContext = PipelineContext.getContextManager().getInstanceContext().getLockContext();
-        if (lockContext.isLocked(databaseName)) {
+        LockNameDefinition lockNameDefinition = LockNameDefinitionFactory.newDatabaseDefinition(databaseName);
+        if (lockContext.isLocked(lockNameDefinition)) {
             log.info("stopClusterWriteDB, already stopped");
             return;
         }
-        if (lockContext.tryLock(databaseName, LockMode.READ)) {
+        if (lockContext.tryLock(lockNameDefinition)) {
             log.info("stopClusterWriteDB, tryLockSuccess=true");
             return;
         }
@@ -203,9 +205,10 @@ public final class RuleAlteredJobAPIImpl extends AbstractPipelineJobAPIImpl impl
     @Override
     public void restoreClusterWriteDB(final String databaseName, final String jobId) {
         LockContext lockContext = PipelineContext.getContextManager().getInstanceContext().getLockContext();
-        if (lockContext.isLocked(databaseName)) {
+        LockNameDefinition lockNameDefinition = LockNameDefinitionFactory.newDatabaseDefinition(databaseName);
+        if (lockContext.isLocked(lockNameDefinition)) {
             log.info("restoreClusterWriteDB, before releaseLock, databaseName={}, jobId={}", databaseName, jobId);
-            lockContext.releaseLock(databaseName);
+            lockContext.releaseLock(lockNameDefinition);
             return;
         }
         log.info("restoreClusterWriteDB, isLocked false, databaseName={}", databaseName);
diff --git a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/rulealtered/RuleAlteredJobWorker.java b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/rulealtered/RuleAlteredJobWorker.java
index b2e779f2d45..094a0d07f05 100644
--- a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/rulealtered/RuleAlteredJobWorker.java
+++ b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/rulealtered/RuleAlteredJobWorker.java
@@ -44,6 +44,7 @@ import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.rulealtered.OnRuleAlteredActionConfiguration;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.infra.lock.LockNameDefinition;
 import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.swapper.YamlRuleConfigurationSwapperEngine;
@@ -51,6 +52,7 @@ import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.cache.event.StartScalingEvent;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.ScalingReleaseDatabaseLevelLockEvent;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.ScalingTaskFinishedEvent;
+import org.apache.shardingsphere.mode.manager.lock.definition.LockNameDefinitionFactory;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -296,9 +298,10 @@ public final class RuleAlteredJobWorker {
     private void restoreSourceWriting(final String databaseName) {
         log.info("restoreSourceWriting, databaseName={}", databaseName);
         LockContext lockContext = PipelineContext.getContextManager().getInstanceContext().getLockContext();
-        if (lockContext.isLocked(databaseName)) {
+        LockNameDefinition lockNameDefinition = LockNameDefinitionFactory.newDatabaseDefinition(databaseName);
+        if (lockContext.isLocked(lockNameDefinition)) {
             log.info("Source writing is still stopped on database '{}', restore it now", databaseName);
-            lockContext.releaseLock(databaseName);
+            lockContext.releaseLock(lockNameDefinition);
         }
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockContext.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockContext.java
new file mode 100644
index 00000000000..2fe250f9aee
--- /dev/null
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockContext.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.lock;
+
+import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.infra.lock.LockLevel;
+import org.apache.shardingsphere.infra.lock.LockNameDefinition;
+import org.apache.shardingsphere.mode.manager.lock.definition.DatabaseLockNameDefinition;
+
+/**
+ * Abstract lock context.
+ */
+public abstract class AbstractLockContext implements LockContext {
+    
+    @Override
+    public boolean tryLock(final LockNameDefinition lockNameDefinition) {
+        LockLevel lockLevel = lockNameDefinition.getLockLevel();
+        switch (lockLevel) {
+            case DATABASE:
+                return tryLock((DatabaseLockNameDefinition) lockNameDefinition);
+            case SCHEMA:
+            case TABLE:
+            default:
+                throw new UnsupportedOperationException();
+        }
+    }
+    
+    protected abstract boolean tryLock(DatabaseLockNameDefinition lockNameDefinition);
+    
+    @Override
+    public boolean tryLock(final LockNameDefinition lockNameDefinition, final long timeoutMilliseconds) {
+        LockLevel lockLevel = lockNameDefinition.getLockLevel();
+        switch (lockLevel) {
+            case DATABASE:
+                return tryLock((DatabaseLockNameDefinition) lockNameDefinition, timeoutMilliseconds);
+            case SCHEMA:
+            case TABLE:
+            default:
+                throw new UnsupportedOperationException();
+        }
+    }
+    
+    protected abstract boolean tryLock(DatabaseLockNameDefinition lockNameDefinition, long timeoutMilliseconds);
+    
+    @Override
+    public void releaseLock(final LockNameDefinition lockNameDefinition) {
+        LockLevel lockLevel = lockNameDefinition.getLockLevel();
+        switch (lockLevel) {
+            case DATABASE:
+                releaseLock((DatabaseLockNameDefinition) lockNameDefinition);
+                break;
+            case SCHEMA:
+            case TABLE:
+            default:
+                throw new UnsupportedOperationException();
+        }
+    }
+    
+    protected abstract void releaseLock(DatabaseLockNameDefinition lockNameDefinition);
+    
+    @Override
+    public boolean isLocked(final LockNameDefinition lockNameDefinition) {
+        LockLevel lockLevel = lockNameDefinition.getLockLevel();
+        switch (lockLevel) {
+            case DATABASE:
+                return isLocked((DatabaseLockNameDefinition) lockNameDefinition);
+            case SCHEMA:
+            case TABLE:
+            default:
+                throw new UnsupportedOperationException();
+        }
+    }
+    
+    protected abstract boolean isLocked(DatabaseLockNameDefinition lockNameDefinition);
+}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java
index a0ab6728759..23d1321955d 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.mode.manager.lock;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.mode.manager.lock.definition.LockNameDefinitionFactory;
 
 /**
  * Lock judge engine for ShardingSphere.
@@ -36,7 +37,7 @@ public final class ShardingSphereLockJudgeEngine extends AbstractLockJudgeEngine
     @Override
     public boolean isLocked(final String databaseName, final SQLStatementContext<?> sqlStatementContext) {
         if (isWriteStatement(sqlStatementContext.getSqlStatement())) {
-            return getLockContext().isLocked(databaseName);
+            return getLockContext().isLocked(LockNameDefinitionFactory.newDatabaseDefinition(databaseName));
         }
         return false;
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/DatabaseLockNameDefinition.java
similarity index 59%
rename from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
rename to shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/DatabaseLockNameDefinition.java
index 94ec1a973a5..3e446f34ab3 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/lock/LockType.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/DatabaseLockNameDefinition.java
@@ -15,12 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.lock;
+package org.apache.shardingsphere.mode.manager.lock.definition;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.lock.LockLevel;
+import org.apache.shardingsphere.infra.lock.LockMode;
+import org.apache.shardingsphere.infra.lock.LockNameDefinition;
 
 /**
- * Lock type.
+ * Database lock name definition.
  */
-public enum LockType {
+@RequiredArgsConstructor
+@Getter
+public final class DatabaseLockNameDefinition implements LockNameDefinition {
+    
+    private final String databaseName;
+    
+    private final LockMode lockMode;
     
-    STANDARD, GENERAL, DATABASE, SCHEMA
+    private final LockLevel lockLevel;
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/LockNameDefinitionFactory.java
similarity index 55%
copy from shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java
copy to shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/LockNameDefinitionFactory.java
index a0ab6728759..b3f0d931762 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngine.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/lock/definition/LockNameDefinitionFactory.java
@@ -15,29 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.mode.manager.lock;
+package org.apache.shardingsphere.mode.manager.lock.definition;
 
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.lock.LockLevel;
+import org.apache.shardingsphere.infra.lock.LockMode;
+import org.apache.shardingsphere.infra.lock.LockNameDefinition;
 
 /**
- * Lock judge engine for ShardingSphere.
+ * Lock name definition factory.
  */
-@RequiredArgsConstructor
-public final class ShardingSphereLockJudgeEngine extends AbstractLockJudgeEngine {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class LockNameDefinitionFactory {
     
     /**
-     * Is locked.
+     * New database definition.
      *
      * @param databaseName database name
-     * @param sqlStatementContext sql statement context
-     * @return is locked or not
+     * @return database lock name definition
      */
-    @Override
-    public boolean isLocked(final String databaseName, final SQLStatementContext<?> sqlStatementContext) {
-        if (isWriteStatement(sqlStatementContext.getSqlStatement())) {
-            return getLockContext().isLocked(databaseName);
-        }
-        return false;
+    public static LockNameDefinition newDatabaseDefinition(final String databaseName) {
+        return new DatabaseLockNameDefinition(databaseName, LockMode.READ, LockLevel.DATABASE);
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockJudgeEngineTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockJudgeEngineTest.java
new file mode 100644
index 00000000000..cac9e41ff3b
--- /dev/null
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/AbstractLockJudgeEngineTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.lock;
+
+import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public final class AbstractLockJudgeEngineTest {
+    
+    private AbstractLockJudgeEngine engine;
+    
+    @Before
+    public void setUp() {
+        engine = (AbstractLockJudgeEngine) LockJudgeEngineBuilder.build(mock(LockContext.class));
+    }
+    
+    @Test
+    public void assertIsWriteDDLStatement() {
+        assertTrue(engine.isWriteStatement(mock(DDLStatement.class)));
+        assertTrue(engine.isWriteStatement(mock(InsertStatement.class)));
+        assertTrue(engine.isWriteStatement(mock(UpdateStatement.class)));
+        assertTrue(engine.isWriteStatement(mock(DeleteStatement.class)));
+        assertFalse(engine.isWriteStatement(mock(SelectStatement.class)));
+    }
+}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngineTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngineTest.java
deleted file mode 100644
index f8a3ab3e31e..00000000000
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/lock/ShardingSphereLockJudgeEngineTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mode.manager.lock;
-
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementContext;
-import org.apache.shardingsphere.infra.lock.LockContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public final class ShardingSphereLockJudgeEngineTest {
-    
-    private LockJudgeEngine engine;
-    
-    @Before
-    public void setUp() {
-        LockContext lockContext = mock(LockContext.class);
-        when(lockContext.isLocked("databaseName")).thenReturn(true);
-        engine = LockJudgeEngineBuilder.build(lockContext);
-    }
-    
-    @Test
-    public void assertDDLIsLocked() {
-        SQLStatementContext<DDLStatement> sqlStatementContext = mock(SQLStatementContext.class);
-        when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DDLStatement.class));
-        assertTrue(engine.isLocked("databaseName", sqlStatementContext));
-    }
-    
-    @Test
-    public void assertInsertIsLocked() {
-        InsertStatementContext insertStatementContext = mock(InsertStatementContext.class);
-        when(insertStatementContext.getSqlStatement()).thenReturn(mock(InsertStatement.class));
-        assertTrue(engine.isLocked("databaseName", insertStatementContext));
-    }
-    
-    @Test
-    public void assertUpdateIsLocked() {
-        UpdateStatementContext updateStatementContext = mock(UpdateStatementContext.class);
-        when(updateStatementContext.getSqlStatement()).thenReturn(mock(UpdateStatement.class));
-        assertTrue(engine.isLocked("databaseName", updateStatementContext));
-    }
-    
-    @Test
-    public void assertDeleteIsLocked() {
-        DeleteStatementContext deleteStatementContext = mock(DeleteStatementContext.class);
-        when(deleteStatementContext.getSqlStatement()).thenReturn(mock(DeleteStatement.class));
-        assertTrue(engine.isLocked("databaseName", deleteStatementContext));
-    }
-    
-    @Test
-    public void assertSelectIsLocked() {
-        SelectStatementContext selectStatementContext = mock(SelectStatementContext.class);
-        when(selectStatementContext.getSqlStatement()).thenReturn(mock(SelectStatement.class));
-        assertFalse(engine.isLocked("databaseName", selectStatementContext));
-    }
-}
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContext.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContext.java
index 7af5951853b..44345bd127c 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContext.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContext.java
@@ -19,22 +19,20 @@ package org.apache.shardingsphere.mode.manager.cluster.coordinator.lock;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.lock.LockContext;
-import org.apache.shardingsphere.infra.lock.LockMode;
 import org.apache.shardingsphere.infra.lock.ShardingSphereLock;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.manager.ShardingSphereLockManager;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.mutex.ShardingSphereInterMutexLockHolder;
+import org.apache.shardingsphere.mode.manager.lock.AbstractLockContext;
+import org.apache.shardingsphere.mode.manager.lock.definition.DatabaseLockNameDefinition;
 import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
 
-import java.util.Set;
-
 /**
  * Distributed lock context.
  */
 @RequiredArgsConstructor
-public final class DistributedLockContext implements LockContext {
+public final class DistributedLockContext extends AbstractLockContext {
     
     static {
         ShardingSphereServiceLoader.register(ShardingSphereLockManager.class);
@@ -60,42 +58,22 @@ public final class DistributedLockContext implements LockContext {
     }
     
     @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode) {
-        return lockManager.tryLock(databaseName, lockMode);
-    }
-    
-    @Override
-    public boolean tryLock(final String databaseName, final Set<String> schemaNames, final LockMode lockMode) {
-        return lockManager.tryLock(databaseName, schemaNames, lockMode);
-    }
-    
-    @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode, final long timeoutMilliseconds) {
-        return lockManager.tryLock(databaseName, lockMode, timeoutMilliseconds);
-    }
-    
-    @Override
-    public boolean tryLock(final String databaseName, final Set<String> schemaNames, final LockMode lockMode, final long timeoutMilliseconds) {
-        return lockManager.tryLock(databaseName, schemaNames, lockMode, timeoutMilliseconds);
-    }
-    
-    @Override
-    public void releaseLock(final String databaseName) {
-        lockManager.releaseLock(databaseName);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        return lockManager.tryLock(lockNameDefinition.getDatabaseName(), lockNameDefinition.getLockMode());
     }
     
     @Override
-    public void releaseLock(final String databaseName, final String schemaName) {
-        lockManager.releaseLock(databaseName, schemaName);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition, final long timeoutMilliseconds) {
+        return lockManager.tryLock(lockNameDefinition.getDatabaseName(), lockNameDefinition.getLockMode(), timeoutMilliseconds);
     }
     
     @Override
-    public boolean isLocked(final String databaseName) {
-        return lockManager.isLocked(databaseName);
+    protected void releaseLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        lockManager.releaseLock(lockNameDefinition.getDatabaseName());
     }
     
     @Override
-    public boolean isLocked(final String databaseName, final String schemaName) {
-        return lockManager.isLocked(databaseName, schemaName);
+    protected boolean isLocked(final DatabaseLockNameDefinition lockNameDefinition) {
+        return lockManager.isLocked(lockNameDefinition.getDatabaseName());
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/ShardingSphereLockManager.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/ShardingSphereLockManager.java
index 61d74d8ed86..f7a11c46717 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/ShardingSphereLockManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/ShardingSphereLockManager.java
@@ -23,8 +23,6 @@ import org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.mutex.Sha
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.spi.type.required.RequiredSPI;
 
-import java.util.Set;
-
 /**
  * Lock manager of ShardingSphere.
  */
@@ -64,31 +62,6 @@ public interface ShardingSphereLockManager extends RequiredSPI {
      */
     boolean tryLock(String databaseName, LockMode lockMode, long timeoutMilliseconds);
     
-    /**
-     * Try lock for schemas.
-     *
-     * @param databaseName database name
-     * @param schemaNames schema names
-     * @param lockMode lock mode
-     * @return is locked or not
-     */
-    default boolean tryLock(String databaseName, Set<String> schemaNames, LockMode lockMode) {
-        throw new UnsupportedOperationException();
-    }
-    
-    /**
-     * Try lock for schemas.
-     *
-     * @param databaseName database name
-     * @param schemaNames schema names
-     * @param lockMode lock mode
-     * @param timeoutMilliseconds timeout milliseconds
-     * @return is locked or not
-     */
-    default boolean tryLock(String databaseName, Set<String> schemaNames, LockMode lockMode, long timeoutMilliseconds) {
-        throw new UnsupportedOperationException();
-    }
-    
     /**
      * Release lock for database.
      *
@@ -96,16 +69,6 @@ public interface ShardingSphereLockManager extends RequiredSPI {
      */
     void releaseLock(String databaseName);
     
-    /**
-     * Release lock for schemas.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     */
-    default void releaseLock(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
-    
     /**
      * Is locked database.
      *
@@ -113,15 +76,4 @@ public interface ShardingSphereLockManager extends RequiredSPI {
      * @return is locked or not
      */
     boolean isLocked(String databaseName);
-    
-    /**
-     * Is locked schema.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     * @return is locked or not
-     */
-    default boolean isLocked(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/state/LockStateContext.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/state/LockStateContext.java
index f41a69b3d7d..f45ce603e74 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/state/LockStateContext.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/manager/state/LockStateContext.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.manager.state;
 
-import org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.mutex.ShardingSphereInterMutexLockHolder;
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.spi.type.required.RequiredSPI;
 
@@ -27,15 +26,6 @@ import org.apache.shardingsphere.spi.type.required.RequiredSPI;
 @SingletonSPI
 public interface LockStateContext extends RequiredSPI {
     
-    /**
-     * Init lock state context.
-     *
-     * @param lockHolder lock holder
-     */
-    default void init(ShardingSphereInterMutexLockHolder lockHolder) {
-        throw new UnsupportedOperationException();
-    }
-    
     /**
      * Register lock state.
      *
@@ -43,16 +33,6 @@ public interface LockStateContext extends RequiredSPI {
      */
     void register(String databaseName);
     
-    /**
-     * Register lock state.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     */
-    default void register(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
-    
     /**
      * Un register lock state.
      *
@@ -60,16 +40,6 @@ public interface LockStateContext extends RequiredSPI {
      */
     void unregister(String databaseName);
     
-    /**
-     * Un-register lock state.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     */
-    default void unregister(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
-    
     /**
      * Is locked.
      *
@@ -77,15 +47,4 @@ public interface LockStateContext extends RequiredSPI {
      * @return is locked or not
      */
     boolean isLocked(String databaseName);
-    
-    /**
-     * Is locked.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     * @return is locked or not
-     */
-    default boolean isLocked(String databaseName, String schemaName) {
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/util/LockNodeType.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/util/LockNodeType.java
index 362343ef19b..51d4e6e340e 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/util/LockNodeType.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/util/LockNodeType.java
@@ -22,5 +22,5 @@ package org.apache.shardingsphere.mode.manager.cluster.coordinator.lock.util;
  */
 public enum LockNodeType {
     
-    DISTRIBUTED, DATABASE, SCHEMA
+    DISTRIBUTED, DATABASE, SCHEMA, TABLE
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContextTest.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContextTest.java
index 6c184612fa5..d1d7ca62c95 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContextTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/lock/DistributedLockContextTest.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.instance.definition.InstanceDefinition;
 import org.apache.shardingsphere.infra.instance.definition.InstanceType;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 import org.apache.shardingsphere.infra.lock.ShardingSphereLock;
+import org.apache.shardingsphere.mode.manager.lock.definition.LockNameDefinitionFactory;
 import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import org.junit.Test;
 
@@ -56,7 +57,7 @@ public final class DistributedLockContextTest {
         ComputeNodeInstance currentInstance = new ComputeNodeInstance(new InstanceDefinition(InstanceType.PROXY, "127.0.0.1@3307"));
         DistributedLockContext distributedLockContext = new DistributedLockContext(mock(ClusterPersistRepository.class));
         new InstanceContext(currentInstance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), distributedLockContext);
-        distributedLockContext.releaseLock("database");
+        distributedLockContext.releaseLock(LockNameDefinitionFactory.newDatabaseDefinition("database"));
     }
     
     @Test
@@ -64,6 +65,6 @@ public final class DistributedLockContextTest {
         ComputeNodeInstance currentInstance = new ComputeNodeInstance(new InstanceDefinition(InstanceType.PROXY, "127.0.0.1@3307"));
         DistributedLockContext distributedLockContext = new DistributedLockContext(mock(ClusterPersistRepository.class));
         new InstanceContext(currentInstance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), distributedLockContext);
-        assertFalse(distributedLockContext.isLocked("database"));
+        assertFalse(distributedLockContext.isLocked(LockNameDefinitionFactory.newDatabaseDefinition("database")));
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/lock/MemoryLockContext.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/lock/MemoryLockContext.java
index 205a11a6110..0ac09ff9aea 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/lock/MemoryLockContext.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/lock/MemoryLockContext.java
@@ -17,14 +17,14 @@
 
 package org.apache.shardingsphere.mode.manager.memory.lock;
 
-import org.apache.shardingsphere.infra.lock.LockContext;
-import org.apache.shardingsphere.infra.lock.LockMode;
 import org.apache.shardingsphere.infra.lock.ShardingSphereLock;
+import org.apache.shardingsphere.mode.manager.lock.AbstractLockContext;
+import org.apache.shardingsphere.mode.manager.lock.definition.DatabaseLockNameDefinition;
 
 /**
  * Memory lock context.
  */
-public final class MemoryLockContext implements LockContext {
+public final class MemoryLockContext extends AbstractLockContext {
     
     private final ShardingSphereLock memoryLock = new ShardingSphereMemoryLock();
     
@@ -34,22 +34,22 @@ public final class MemoryLockContext implements LockContext {
     }
     
     @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode) {
-        return memoryLock.tryLock(databaseName);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        return memoryLock.tryLock(lockNameDefinition.getDatabaseName());
     }
     
     @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode, final long timeoutMilliseconds) {
-        return memoryLock.tryLock(databaseName, timeoutMilliseconds);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition, final long timeoutMilliseconds) {
+        return memoryLock.tryLock(lockNameDefinition.getDatabaseName(), timeoutMilliseconds);
     }
     
     @Override
-    public void releaseLock(final String databaseName) {
-        memoryLock.releaseLock(databaseName);
+    protected void releaseLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        memoryLock.releaseLock(lockNameDefinition.getDatabaseName());
     }
     
     @Override
-    public boolean isLocked(final String databaseName) {
-        return memoryLock.isLocked(databaseName);
+    protected boolean isLocked(final DatabaseLockNameDefinition lockNameDefinition) {
+        return memoryLock.isLocked(lockNameDefinition.getDatabaseName());
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java
index 5c336e985c1..0f292fadc9d 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java
@@ -17,14 +17,14 @@
 
 package org.apache.shardingsphere.mode.manager.standalone.lock;
 
-import org.apache.shardingsphere.infra.lock.LockContext;
-import org.apache.shardingsphere.infra.lock.LockMode;
 import org.apache.shardingsphere.infra.lock.ShardingSphereLock;
+import org.apache.shardingsphere.mode.manager.lock.AbstractLockContext;
+import org.apache.shardingsphere.mode.manager.lock.definition.DatabaseLockNameDefinition;
 
 /**
  * Standalone lock context.
  */
-public final class StandaloneLockContext implements LockContext {
+public final class StandaloneLockContext extends AbstractLockContext {
     
     private final ShardingSphereLock standaloneLock = new ShardingSphereStandaloneLock();
     
@@ -34,22 +34,22 @@ public final class StandaloneLockContext implements LockContext {
     }
     
     @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode) {
-        return standaloneLock.tryLock(databaseName);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        return standaloneLock.tryLock(lockNameDefinition.getDatabaseName());
     }
     
     @Override
-    public boolean tryLock(final String databaseName, final LockMode lockMode, final long timeoutMilliseconds) {
-        return standaloneLock.tryLock(databaseName, timeoutMilliseconds);
+    protected boolean tryLock(final DatabaseLockNameDefinition lockNameDefinition, final long timeoutMilliseconds) {
+        return standaloneLock.tryLock(lockNameDefinition.getDatabaseName(), timeoutMilliseconds);
     }
     
     @Override
-    public void releaseLock(final String databaseName) {
-        standaloneLock.releaseLock(databaseName);
+    protected void releaseLock(final DatabaseLockNameDefinition lockNameDefinition) {
+        standaloneLock.releaseLock(lockNameDefinition.getDatabaseName());
     }
     
     @Override
-    public boolean isLocked(final String databaseName) {
-        return standaloneLock.isLocked(databaseName);
+    protected boolean isLocked(final DatabaseLockNameDefinition lockNameDefinition) {
+        return standaloneLock.isLocked(lockNameDefinition.getDatabaseName());
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/DistSQLBackendHandlerFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/DistSQLBackendHandlerFactory.java
index 3150afccfd7..7e7f5ef64ba 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/DistSQLBackendHandlerFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/DistSQLBackendHandlerFactory.java
@@ -27,6 +27,8 @@ import org.apache.shardingsphere.distsql.parser.statement.ral.scaling.QueryableS
 import org.apache.shardingsphere.distsql.parser.statement.ral.scaling.UpdatableScalingRALStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.RDLStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
+import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.mode.manager.lock.definition.LockNameDefinitionFactory;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.exception.DatabaseLockedException;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -75,7 +77,8 @@ public final class DistSQLBackendHandlerFactory {
         if (null == databaseName) {
             return;
         }
-        if (ProxyContext.getInstance().getContextManager().getInstanceContext().getLockContext().isLocked(databaseName)) {
+        LockContext lockContext = ProxyContext.getInstance().getContextManager().getInstanceContext().getLockContext();
+        if (lockContext.isLocked(LockNameDefinitionFactory.newDatabaseDefinition(databaseName))) {
             throw new DatabaseLockedException(databaseName);
         }
     }