Code review comment: Seems `tryLock`'s parameter `lockName` is still handled as `schemaName` in `ShardingSphereDistributeGlobalLock.innerTryLock`. `LockContext` is just designed for schema lock for now.  Could we use `PipelineSimpleLock` to implement it?

Code under review:
private void prepareTarget(final JobConfiguration jobConfig, final PipelineDataSourceManager dataSourceManager) {
        DataSourcePreparer dataSourcePreparer = EnvironmentCheckerFactory.getDataSourcePreparer(jobConfig.getHandleConfig().getTargetDatabaseType());
        if (null == dataSourcePreparer) {
            log.info("dataSourcePreparer null, ignore prepare target");
            return;
        }
        LockContext lockContext = PipelineContext.getContextManager().getInstanceContext().getLockContext();
        ShardingSphereLock lock = lockContext.getOrCreateSchemaLock(jobConfig.getWorkflowConfig().getSchemaName());
        
        boolean skipPrepare = !lock.tryLock("prepareTargetTablesLock", 100);
        if (skipPrepare) {
            
            while (lock.isLocked("prepareTargetTablesLock")) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    lock.releaseLock("prepareTargetTablesLock");
                }
            }
            lock.releaseLock("prepareTargetTablesLock");
            return;
        }
        try {
            JobDataNodeLine tablesFirstDataNodes = JobDataNodeLine.unmarshal(jobConfig.getHandleConfig().getTablesFirstDataNodes());
            PrepareTargetTablesParameter prepareTargetTablesParameter = new PrepareTargetTablesParameter(tablesFirstDataNodes,
                    jobConfig.getPipelineConfig(), dataSourceManager);
            dataSourcePreparer.prepareTargetTables(prepareTargetTablesParameter);
        } finally {
            lock.releaseLock("prepareTargetTablesLock");
        }
    }

Line commented on: boolean skipPrepare = !lock.tryLock("prepareTargetTablesLock", 100);

Revised code:
private void prepareTarget(final JobConfiguration jobConfig, final PipelineDataSourceManager dataSourceManager) {
        DataSourcePreparer dataSourcePreparer = EnvironmentCheckerFactory.getDataSourcePreparer(jobConfig.getHandleConfig().getTargetDatabaseType());
        if (null == dataSourcePreparer) {
            log.info("dataSourcePreparer null, ignore prepare target");
            return;
        }
        final PipelineSimpleLock lock = PipelineSimpleLock.getInstance();
        
        boolean skipPrepare = !lock.tryLock(getPrepareLockName(jobConfig.getHandleConfig().getJobId()), 100);
        if (skipPrepare) {
            int loopCount = 0;
            int maxLoopCount = 30;
            while (loopCount < maxLoopCount) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    lock.releaseLock(getPrepareLockName(jobConfig.getHandleConfig().getJobId()));
                }
                
                if (lock.tryLock(getPrepareLockName(jobConfig.getHandleConfig().getJobId()), 100)) {
                    lock.releaseLock(getPrepareLockName(jobConfig.getHandleConfig().getJobId()));
                    return;
                }
                loopCount++;
            }
        }
        try {
            JobDataNodeLine tablesFirstDataNodes = JobDataNodeLine.unmarshal(jobConfig.getHandleConfig().getTablesFirstDataNodes());
            PrepareTargetTablesParameter prepareTargetTablesParameter = new PrepareTargetTablesParameter(tablesFirstDataNodes,
                    jobConfig.getPipelineConfig(), dataSourceManager);
            dataSourcePreparer.prepareTargetTables(prepareTargetTablesParameter);
        } finally {
            lock.releaseLock(getPrepareLockName(jobConfig.getHandleConfig().getJobId()));
        }
    }