首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Liquibase锁-原因?

Liquibase锁-原因?
EN

Stack Overflow用户
提问于 2013-03-21 00:06:16
回答 9查看 233.4K关注 0票数 326

当我在Oracle服务器上运行大量的liquibase脚本时,我得到了这个问题。SomeComputer就是我。

代码语言:javascript
复制
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Liquibase Update Failed: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
SEVERE 2013-03-20 16:59:liquibase: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
liquibase.exception.LockException: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
        at liquibase.lockservice.LockService.waitForLock(LockService.java:81)
        at liquibase.Liquibase.tag(Liquibase.java:507)
        at liquibase.integration.commandline.Main.doMigration(Main.java:643)
        at liquibase.integration.commandline.Main.main(Main.java:116)

会不会是同时进行的会话/事务的数量已经达到?有谁有什么想法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-09-30 02:20:43

有时,如果更新应用程序突然停止,则锁仍然卡住。

然后运行

代码语言:javascript
复制
UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

对数据库有帮助。

您可能还需要用LOCKED=FALSE替换LOCKED=0

或者您可以简单地删除DATABASECHANGELOGLOCK表,它将被重新创建。

票数 715
EN

Stack Overflow用户

发布于 2013-03-22 17:42:24

问题在于Liquibase中SequenceExists的错误实现。因为使用这些语句的变更集花费了很长时间,并且被意外中止。然后,下一次尝试执行liquibase scripts时,锁就被持有了。

代码语言:javascript
复制
  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
      <not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

一种解决方法是使用普通SQL来检查:

代码语言:javascript
复制
  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
            <sqlCheck expectedResult="0">
              select count(*) from user_sequences where sequence_name = 'SEQUENCE_NAME_SEQ';
            </sqlCheck>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

Lockdata存储在表DATABASECHANGELOCK中。要解除锁定,只需将1更改为0,或者删除该表并重新创建。

票数 27
EN

Stack Overflow用户

发布于 2019-04-05 05:39:15

没有提到使用哪个环境来执行Liquibase。如果是Spring Boot2,则可以扩展liquibase.lockservice.StandardLockService而不需要运行直接的SQL语句,这要干净得多。例如:

代码语言:javascript
复制
/**
 * This class is enforcing to release the lock from the database.
 *
 */
 public class ForceReleaseLockService extends StandardLockService {

    @Override
    public int getPriority() {
        return super.getPriority()+1;
    }

    @Override
    public void waitForLock() throws LockException {
        try {
            super.forceReleaseLock();
        } catch (DatabaseException e) {
            throw new LockException("Could not enforce getting the lock.", e);
        }
        super.waitForLock();
    }
}

代码强制释放锁。这在测试设置中很有用,在这种设置中,在出现错误或调试中止时可能不会调用release调用。

该类必须放在liquibase.ext包中,并将由Spring Boot2自动配置获取。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15528795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档