middle
Как работает rollback в Liquibase?
Rollback — это механизм отката изменений, внесённых changeset-ами. Liquibase поддерживает автоматический и ручной rollback.
Автоматический rollback
Для многих типов изменений Liquibase генерирует обратные операции автоматически:
| Изменение | Автоматический rollback |
|---|---|
createTable |
dropTable |
addColumn |
dropColumn |
createIndex |
dropIndex |
addForeignKeyConstraint |
dropForeignKeyConstraint |
createView |
dropView |
createSequence |
dropSequence |
renameTable |
renameTable (обратное) |
Ручной rollback
Для операций, которые Liquibase не может откатить автоматически (например, dropTable, sql, insert), необходимо указать rollback вручную:
Пример
<changeSet id="9" author="petrov">
<dropColumn tableName="users" columnName="middle_name"/>
<rollback>
<addColumn tableName="users">
<column name="middle_name" type="VARCHAR(100)"/>
</addColumn>
</rollback>
</changeSet>
Для SQL-формата:
Пример
--changeset petrov:10
ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'ACTIVE';
--rollback ALTER TABLE users DROP COLUMN status;
Команды rollback
Пример
# Откат последних N changeset-ов
liquibase rollbackCount 1
# Откат до определённого тега
liquibase rollback release-1.0
# Откат до определённой даты
liquibase rollbackToDate 2025-01-15T10:00:00
# Генерация SQL для отката (без выполнения)
liquibase rollbackCountSQL 1
liquibase rollbackSQL release-1.0
Рекомендуется всегда явно указывать rollback для changeset-ов, даже если Liquibase может сгенерировать его автоматически — это делает миграции более предсказуемыми.
На собеседовании: важно знать разницу между автоматическим и ручным rollback, а также уметь назвать команды отката. Частая ошибка — не упомянуть, что для деструктивных операций (drop, sql) rollback нужно писать вручную.