【问题标题】:Liquibase "Could not release lock" errorLiquibase“无法释放锁定”错误
【发布时间】:2014-10-30 13:25:56
【问题描述】:

在运行 Liquibase 变更集时,我收到以下错误: Could not release lock。基本异常实际上是SQLException: Connection is closed!

变更集包含renameColumn

<changeSet author="me" id="renameaTob">
    <renameColumn newColumnName="b" oldColumnName="a" columnDataType="BIGINT(19)" tableName="aTable" />
</changeSet>    

【问题讨论】:

    标签: java sql foreign-keys liquibase


    【解决方案1】:

    问题在于要重命名的列是外键约束的一部分。

    解决方案是先删除约束,然后使用新列名再次添加它。但是如果所有这些操作都在同一个变更集中完成,结果也没有什么不同。因此必须将其拆分为两个变更集:首先,删除约束并重命名列,其次,重新创建外键约束。

    <changeSet author="me" id="renameaTob">
        <dropForeignKeyConstraint baseTableName="aTable" constraintName="a_c_fk2"/>
        <renameColumn newColumnName="b" oldColumnName="a" columnDataType="BIGINT(19)" tableName="aTable" />
    </changeSet>
    
    <changeSet author="me" id="addFkAgain">
        <addForeignKeyConstraint baseColumnNames="b"
                baseTableName="aTable" constraintName="b_c_fk2"
                deferrable="false" initiallyDeferred="false" onDelete="NO ACTION"
                onUpdate="NO ACTION" referencedColumnNames="c" referencedTableName="refTable" />
    </changeSet>
    

    我认为也可以只使用一个变更集并添加runInTransaction='false',但这无论如何都不是一个好主意。

    【讨论】:

    • 我建议将更改作为 3 个单独的更改集进行。进行了相同的更改,但是由于 Liquibase 将单独跟踪每个更改,因此如果 changeSet 的前半部分通过(dropForeignKey)但第二部分失败(renameColumn),您不会遇到问题。如果发生这种情况,在下一次更新时,liquibase 仍将尝试运行 dropForeignKeyConstraint,但它会失败并出现 OBJECT NOT EXISTS 错误。
    • RunInTransaction 不会影响这些特定的变更集,因为所有语句都会在大多数数据库上自动提交。 runInTransaction=false 的主要用途是用于不允许在事务中使用 DDL 语句的数据库。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2020-07-07
    • 2020-03-22
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多