From 4586f8f42e4e870e6dc64233f85e40dfcad7c3a8 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 15 Jan 2026 09:49:15 -0800 Subject: [PATCH 1/6] GitHub Issue #783: Server lockup when updating data class domain design --- .../labkey/experiment/api/ExperimentServiceImpl.java | 11 ++++++----- .../labkey/experiment/api/SampleTypeServiceImpl.java | 6 ++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 367d743da66..cd4d69cbd2e 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -1263,11 +1263,14 @@ public void indexDataClass(ExpDataClassImpl dataClass, SearchService.TaskIndexin if (table == null) return; - // Index the data class if it has never been indexed OR it has changed since it was last indexed + indexDataClassData(dataClass, q); + + // GitHub Issue 783: Server lockup when updating data class domain design + // Index DataClass after data indexing, to avoid holding locks on exp.DataClass table for too long SQLFragment sql = new SQLFragment("SELECT * FROM ") .append(getTinfoDataClass(), "dc") .append(" WHERE dc.LSID = ?").add(dataClass.getLSID()) - .append(" AND (dc.lastIndexed IS NULL OR dc.lastIndexed < ?)") + .append(" AND (dc.lastIndexed IS NULL OR dc.lastIndexed < ?)") // Index the data class if it has never been indexed OR it has changed since it was last indexed .add(dataClass.getModified()); DataClass dClass = new SqlSelector(getExpSchema().getScope(), sql).getObject(DataClass.class); @@ -1276,8 +1279,6 @@ public void indexDataClass(ExpDataClassImpl dataClass, SearchService.TaskIndexin ExpDataClassImpl impl = new ExpDataClassImpl(dClass); impl.index(q, table); } - - indexDataClassData(dataClass, q); }); } @@ -8046,7 +8047,7 @@ public ValidationException updateDataClass(@NotNull Container c, @NotNull User u if (!errors.hasErrors()) { transaction.addCommitTask(() -> clearDataClassCache(c), DbScope.CommitTaskOption.IMMEDIATE, POSTCOMMIT, POSTROLLBACK); - transaction.addCommitTask(() -> indexDataClass(getDataClass(c, dataClass.getName()), SearchService.get().defaultTask().getQueue(c, SearchService.PRIORITY.modified)), POSTCOMMIT); + transaction.addCommitTask(() -> indexDataClass(dataClass, SearchService.get().defaultTask().getQueue(c, SearchService.PRIORITY.modified)), POSTCOMMIT); transaction.commit(); } } diff --git a/experiment/src/org/labkey/experiment/api/SampleTypeServiceImpl.java b/experiment/src/org/labkey/experiment/api/SampleTypeServiceImpl.java index af04d68fa32..94b1feb99a9 100644 --- a/experiment/src/org/labkey/experiment/api/SampleTypeServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/SampleTypeServiceImpl.java @@ -331,6 +331,10 @@ public void indexSampleType(ExpSampleType sampleType, SearchService.TaskIndexing return; queue.addRunnable((q) -> { + indexSampleTypeMaterials(sampleType, q); + + // GitHub Issue 783: Server lockup when updating data class domain design + // Index MaterialSource after materials indexing, to avoid holding locks on exp.MaterialSource table for too long // Index all ExpMaterial that have never been indexed OR where either the ExpSampleType definition or ExpMaterial itself has changed since last indexed SQLFragment sql = new SQLFragment("SELECT * FROM ") .append(getTinfoMaterialSource(), "ms") @@ -345,8 +349,6 @@ public void indexSampleType(ExpSampleType sampleType, SearchService.TaskIndexing ExpSampleTypeImpl impl = new ExpSampleTypeImpl(materialSource); impl.index(q, null); } - - indexSampleTypeMaterials(sampleType, q); }); } From 4b6a6d262021b3bd420c306435533fc39d8866a1 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 19 Jan 2026 12:43:17 -0800 Subject: [PATCH 2/6] lock provisioned table on domain update --- api/src/org/labkey/api/exp/property/Domain.java | 2 +- .../org/labkey/experiment/api/property/DomainImpl.java | 9 +++++---- .../controllers/property/PropertyController.java | 10 +++++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/api/src/org/labkey/api/exp/property/Domain.java b/api/src/org/labkey/api/exp/property/Domain.java index 3c0d7b1c1c6..8e5460427a1 100644 --- a/api/src/org/labkey/api/exp/property/Domain.java +++ b/api/src/org/labkey/api/exp/property/Domain.java @@ -88,7 +88,7 @@ public interface Domain extends IPropertyType * This pattern effectively forces all callers who are trying to manipulate this domain to queue up. */ Lock getDatabaseLock(); - void lockForDelete(DbSchema expSchema); + void lockForUpdateDelete(); void delete(@Nullable User user) throws DomainNotFoundException; default void delete(@Nullable User user, @Nullable String auditUserComment) throws DomainNotFoundException diff --git a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java index 62390100c31..baca719ab9c 100644 --- a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java +++ b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java @@ -405,7 +405,7 @@ public void delete(@Nullable User user, @Nullable String auditUserComment) throw ExperimentService exp = ExperimentService.get(); try (DbScope.Transaction transaction = exp.getSchema().getScope().ensureTransaction()) { - lockForDelete(exp.getSchema()); + lockForUpdateDelete(); DefaultValueService.get().clearDefaultValues(getContainer(), this); OntologyManager.deleteDomain(getTypeURI(), getContainer()); StorageProvisioner.get().drop(this); @@ -434,18 +434,19 @@ public Lock getDatabaseLock() } @Override - public void lockForDelete(DbSchema expSchema) + public void lockForUpdateDelete() { // NOTE code relies on the lock returned from Domain.getLock() does not require unlock(). var lock = getDatabaseLock(); assert lock instanceof DbScope.ServerLock; - assert ExperimentService.get().getSchema().getScope().isTransactionActive(); + DbSchema expSchema = ExperimentService.get().getSchema(); + assert expSchema.getScope().isTransactionActive(); lock.lock(); // CONSIDER verify table exists: SELECT 1 FROM pg_tables WHERE schemaname = ? AND tablename = ? if (null != getStorageTableName() && expSchema.getSqlDialect().isPostgreSQL()) { - SQLFragment lockSQL = new SQLFragment().append("LOCK TABLE ").appendDottedIdentifiers(getDomainKind().getStorageSchemaName(), getStorageTableName()).append(" IN EXCLUSIVE MODE").appendEOS().append("\n"); + SQLFragment lockSQL = new SQLFragment().append("LOCK TABLE ").appendDottedIdentifiers(getDomainKind().getStorageSchemaName(), getStorageTableName()).append(" IN ACCESS EXCLUSIVE MODE").appendEOS().append("\n"); new SqlExecutor(expSchema).execute(lockSQL); } } diff --git a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java index 76a98ccc8a9..f3e9cbe00e6 100644 --- a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java +++ b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java @@ -618,7 +618,7 @@ public void validateForm(DomainApiForm form, Errors errors) public Object execute(DomainApiForm form, BindException errors) { GWTDomain newDomain = form.getDomainDesign(); - GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser()); + GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser(), true); boolean includeWarnings = form.includeWarnings(); boolean hasErrors = false; @@ -1630,6 +1630,11 @@ private static void deleteDomain(String schemaName, String queryName, Container @NotNull private static GWTDomain getDomain(String schemaName, String queryName, Integer domainId, @NotNull Container container, @NotNull User user) throws NotFoundException + { + return getDomain(schemaName, queryName, domainId, container, user, false); + } + @NotNull + private static GWTDomain getDomain(String schemaName, String queryName, Integer domainId, @NotNull Container container, @NotNull User user, boolean getForUpdate) throws NotFoundException { if ((schemaName == null || queryName == null) && domainId == null) { @@ -1646,6 +1651,9 @@ private static GWTDomain getDomain(String schemaName, String queryName, Integ if (!container.equals(dom.getContainer())) // issue 38502 throw new NotFoundException("Could not find domain for " + domainId + " in container '" + container.getPath() + "'."); + if (getForUpdate) + dom.lockForUpdateDelete(); + domain = DomainUtil.getDomainDescriptor(user, dom); } else From d1da5c7dd92298b7062490a36611e68a8de8a8f3 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 19 Jan 2026 12:45:46 -0800 Subject: [PATCH 3/6] lock --- .../src/org/labkey/experiment/api/ExperimentServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index cd4d69cbd2e..1d34569cbee 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -4628,7 +4628,7 @@ private static void _lockDomainsAndProvisionedTables(AssayService assayService, { for (var domain : provider.getDomains(expProtocol)) { - domain.lockForDelete(expSchema); + domain.lockForUpdateDelete(); } } } From 2e3dab8286aa72ba5e1be1344a284257cae45752 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 19 Jan 2026 13:36:42 -0800 Subject: [PATCH 4/6] transaction --- .../property/PropertyController.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java index f3e9cbe00e6..0a894bceb14 100644 --- a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java +++ b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java @@ -47,11 +47,13 @@ import org.labkey.api.data.ContainerService; import org.labkey.api.data.DbSchema; import org.labkey.api.data.DbSchemaType; +import org.labkey.api.data.DbScope; import org.labkey.api.data.ExpDataFileConverter; import org.labkey.api.data.NameExpressionValidationResult; import org.labkey.api.data.SimpleFilter; import org.labkey.api.defaults.DefaultValueService; import org.labkey.api.exp.ChangePropertyDescriptorException; +import org.labkey.api.exp.DomainDescriptor; import org.labkey.api.exp.Identifiable; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.LsidManager; @@ -60,6 +62,7 @@ import org.labkey.api.exp.TemplateInfo; import org.labkey.api.exp.api.DomainKindDesign; import org.labkey.api.exp.api.ExperimentJSONConverter; +import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainKind; @@ -618,12 +621,19 @@ public void validateForm(DomainApiForm form, Errors errors) public Object execute(DomainApiForm form, BindException errors) { GWTDomain newDomain = form.getDomainDesign(); - GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser(), true); boolean includeWarnings = form.includeWarnings(); boolean hasErrors = false; + ValidationException updateErrors; - ValidationException updateErrors = updateDomain(originalDomain, newDomain, form.getOptions(), getContainer(), getUser(), includeWarnings, form.getAuditUserComment()); + try (DbScope.Transaction tx = ExperimentService.get().ensureTransaction()) + { + // GitHub Issue #783: Server lockup when updating data class domain design + GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser(), true); + updateErrors = updateDomain(originalDomain, newDomain, form.getOptions(), getContainer(), getUser(), includeWarnings, form.getAuditUserComment()); + + tx.commit(); + } for (ValidationError ve : updateErrors.getErrors()) { @@ -1642,29 +1652,38 @@ private static GWTDomain getDomain(String schemaName, String queryName, Integ } GWTDomain domain; + Domain dom; if (domainId != null) { - Domain dom = PropertyService.get().getDomain(domainId); + dom = PropertyService.get().getDomain(domainId); if (dom == null) throw new NotFoundException("Could not find domain for " + domainId + "."); if (!container.equals(dom.getContainer())) // issue 38502 throw new NotFoundException("Could not find domain for " + domainId + " in container '" + container.getPath() + "'."); - if (getForUpdate) - dom.lockForUpdateDelete(); - domain = DomainUtil.getDomainDescriptor(user, dom); } else { String domainURI = PropertyService.get().getDomainURI(schemaName, queryName, container, user); - domain = DomainUtil.getDomainDescriptor(user, domainURI, container); - if (domain == null) + DomainDescriptor dd = OntologyManager.getDomainDescriptor(domainURI, container); + if (null != dd) + { + dom = PropertyService.get().getDomain(dd.getDomainId()); + if (dom == null) + throw new NotFoundException("Could not find domain for schemaName=" + schemaName + ", queryName=" + queryName + "."); + + domain = DomainUtil.getDomainDescriptor(container, user, dom, false); + } + else throw new NotFoundException("Could not find domain for schemaName=" + schemaName + ", queryName=" + queryName + "."); } + if (getForUpdate) + dom.lockForUpdateDelete(); + return domain; } From 10e47009bbcbc90168efdc6126ba65cc27daf475 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 19 Jan 2026 15:29:56 -0800 Subject: [PATCH 5/6] revert transaction --- .../labkey/api/exp/property/DomainUtil.java | 2 + .../property/PropertyController.java | 37 +++---------------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index af2309f42c8..3395467e059 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -785,6 +785,8 @@ public static ValidationException updateDomainDescriptor(GWTDomain kind = d.getDomainKind(); ValidationException validationException = validateProperties(d, update, kind, orig, user); diff --git a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java index 0a894bceb14..76a98ccc8a9 100644 --- a/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java +++ b/experiment/src/org/labkey/experiment/controllers/property/PropertyController.java @@ -47,13 +47,11 @@ import org.labkey.api.data.ContainerService; import org.labkey.api.data.DbSchema; import org.labkey.api.data.DbSchemaType; -import org.labkey.api.data.DbScope; import org.labkey.api.data.ExpDataFileConverter; import org.labkey.api.data.NameExpressionValidationResult; import org.labkey.api.data.SimpleFilter; import org.labkey.api.defaults.DefaultValueService; import org.labkey.api.exp.ChangePropertyDescriptorException; -import org.labkey.api.exp.DomainDescriptor; import org.labkey.api.exp.Identifiable; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.LsidManager; @@ -62,7 +60,6 @@ import org.labkey.api.exp.TemplateInfo; import org.labkey.api.exp.api.DomainKindDesign; import org.labkey.api.exp.api.ExperimentJSONConverter; -import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainKind; @@ -621,19 +618,12 @@ public void validateForm(DomainApiForm form, Errors errors) public Object execute(DomainApiForm form, BindException errors) { GWTDomain newDomain = form.getDomainDesign(); + GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser()); boolean includeWarnings = form.includeWarnings(); boolean hasErrors = false; - ValidationException updateErrors; - try (DbScope.Transaction tx = ExperimentService.get().ensureTransaction()) - { - // GitHub Issue #783: Server lockup when updating data class domain design - GWTDomain originalDomain = getDomain(form.getSchemaName(), form.getQueryName(), form.getDomainId(), getContainer(), getUser(), true); - updateErrors = updateDomain(originalDomain, newDomain, form.getOptions(), getContainer(), getUser(), includeWarnings, form.getAuditUserComment()); - - tx.commit(); - } + ValidationException updateErrors = updateDomain(originalDomain, newDomain, form.getOptions(), getContainer(), getUser(), includeWarnings, form.getAuditUserComment()); for (ValidationError ve : updateErrors.getErrors()) { @@ -1640,11 +1630,6 @@ private static void deleteDomain(String schemaName, String queryName, Container @NotNull private static GWTDomain getDomain(String schemaName, String queryName, Integer domainId, @NotNull Container container, @NotNull User user) throws NotFoundException - { - return getDomain(schemaName, queryName, domainId, container, user, false); - } - @NotNull - private static GWTDomain getDomain(String schemaName, String queryName, Integer domainId, @NotNull Container container, @NotNull User user, boolean getForUpdate) throws NotFoundException { if ((schemaName == null || queryName == null) && domainId == null) { @@ -1652,10 +1637,9 @@ private static GWTDomain getDomain(String schemaName, String queryName, Integ } GWTDomain domain; - Domain dom; if (domainId != null) { - dom = PropertyService.get().getDomain(domainId); + Domain dom = PropertyService.get().getDomain(domainId); if (dom == null) throw new NotFoundException("Could not find domain for " + domainId + "."); @@ -1667,23 +1651,12 @@ private static GWTDomain getDomain(String schemaName, String queryName, Integ else { String domainURI = PropertyService.get().getDomainURI(schemaName, queryName, container, user); + domain = DomainUtil.getDomainDescriptor(user, domainURI, container); - DomainDescriptor dd = OntologyManager.getDomainDescriptor(domainURI, container); - if (null != dd) - { - dom = PropertyService.get().getDomain(dd.getDomainId()); - if (dom == null) - throw new NotFoundException("Could not find domain for schemaName=" + schemaName + ", queryName=" + queryName + "."); - - domain = DomainUtil.getDomainDescriptor(container, user, dom, false); - } - else + if (domain == null) throw new NotFoundException("Could not find domain for schemaName=" + schemaName + ", queryName=" + queryName + "."); } - if (getForUpdate) - dom.lockForUpdateDelete(); - return domain; } From 5e8f69edf5691c5c137627cbb236cb5cd68801bd Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 19 Jan 2026 15:46:31 -0800 Subject: [PATCH 6/6] revert transaction --- api/src/org/labkey/api/exp/property/Domain.java | 2 +- api/src/org/labkey/api/exp/property/DomainUtil.java | 5 ++++- .../labkey/experiment/api/ExperimentServiceImpl.java | 2 +- .../labkey/experiment/api/property/DomainImpl.java | 11 +++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/api/src/org/labkey/api/exp/property/Domain.java b/api/src/org/labkey/api/exp/property/Domain.java index 8e5460427a1..34e2640a650 100644 --- a/api/src/org/labkey/api/exp/property/Domain.java +++ b/api/src/org/labkey/api/exp/property/Domain.java @@ -88,7 +88,7 @@ public interface Domain extends IPropertyType * This pattern effectively forces all callers who are trying to manipulate this domain to queue up. */ Lock getDatabaseLock(); - void lockForUpdateDelete(); + void lockForUpdateDelete(DbSchema lockSchema); void delete(@Nullable User user) throws DomainNotFoundException; default void delete(@Nullable User user, @Nullable String auditUserComment) throws DomainNotFoundException diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index 3395467e059..4310bbd2a64 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -54,6 +54,7 @@ import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.PropertyType; import org.labkey.api.exp.TemplateInfo; +import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.api.SampleTypeDomainKind; import org.labkey.api.exp.api.StorageProvisioner; import org.labkey.api.gwt.client.AuditBehaviorType; @@ -785,7 +786,9 @@ public static ValidationException updateDomainDescriptor(GWTDomain kind = d.getDomainKind(); ValidationException validationException = validateProperties(d, update, kind, orig, user); diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 1d34569cbee..6a5dc219038 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -4628,7 +4628,7 @@ private static void _lockDomainsAndProvisionedTables(AssayService assayService, { for (var domain : provider.getDomains(expProtocol)) { - domain.lockForUpdateDelete(); + domain.lockForUpdateDelete(expSchema); } } } diff --git a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java index baca719ab9c..2f7186ce200 100644 --- a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java +++ b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java @@ -405,7 +405,7 @@ public void delete(@Nullable User user, @Nullable String auditUserComment) throw ExperimentService exp = ExperimentService.get(); try (DbScope.Transaction transaction = exp.getSchema().getScope().ensureTransaction()) { - lockForUpdateDelete(); + lockForUpdateDelete(exp.getSchema()); DefaultValueService.get().clearDefaultValues(getContainer(), this); OntologyManager.deleteDomain(getTypeURI(), getContainer()); StorageProvisioner.get().drop(this); @@ -434,20 +434,19 @@ public Lock getDatabaseLock() } @Override - public void lockForUpdateDelete() + public void lockForUpdateDelete(DbSchema lockSchema) { // NOTE code relies on the lock returned from Domain.getLock() does not require unlock(). var lock = getDatabaseLock(); assert lock instanceof DbScope.ServerLock; - DbSchema expSchema = ExperimentService.get().getSchema(); - assert expSchema.getScope().isTransactionActive(); + assert lockSchema.getScope().isTransactionActive(); lock.lock(); // CONSIDER verify table exists: SELECT 1 FROM pg_tables WHERE schemaname = ? AND tablename = ? - if (null != getStorageTableName() && expSchema.getSqlDialect().isPostgreSQL()) + if (null != getStorageTableName() && lockSchema.getSqlDialect().isPostgreSQL()) { SQLFragment lockSQL = new SQLFragment().append("LOCK TABLE ").appendDottedIdentifiers(getDomainKind().getStorageSchemaName(), getStorageTableName()).append(" IN ACCESS EXCLUSIVE MODE").appendEOS().append("\n"); - new SqlExecutor(expSchema).execute(lockSQL); + new SqlExecutor(lockSchema).execute(lockSQL); } }