2014-10-30 2 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. –

+0

RunInTransaction не будет влиять на эти конкретные changeSets, потому что все утверждения автоматически фиксируются в большинстве баз данных. Основное использование для runInTransaction = false - для баз данных, которые не позволяют операторам DDL в транзакции. –

Смежные вопросы