2014-10-30 177 views
0

运行Liquibase变更集时出现以下错误: Could not release lock。基本例外实际上是SQLException: Connection is closed!Liquibase“无法释放锁定”错误

该更改集包含一个renameColumn

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

回答

0

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

解决方法是首先删除约束,然后再添加新的列名。但是,如果所有这些操作都是在相同的变更集中完成的,结果也不例外。所以它必须分成两个变更集:首先,删除约束和重命名列,然后重新创建外键约束。

<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',但这并不是一个好主意,反正。

+0

我建议将更改作为3个独立的changeSets。做了相同的更改,但由于Liquibase会分别跟踪每个变量,所以如果changeSet的前半部分传递(dropForeignKey),但第二个失败(renameColumn),则不会遇到问题。如果发生这种情况,在下次更新时,liquibase仍然会尝试运行dropForeignKeyConstraint,但它会失败,并显示OBJECT NOT EXISTS错误。 – 2014-10-30 19:57:06

+0

RunInTransaction不会影响这些特定的changeSet,因为所有语句都会在大多数数据库上自动提交。 runInTransaction = false的主要用途是针对事务中不允许DDL语句的数据库。 – 2014-10-30 19:57:24