Spring環境のプロジェクトでLiquibaseを使用しています。ただし、ロールバック機能は機能していないようです。
マニュアルに次のように記載されているため、 Springを使用してLiquibaseを実行する場合、ロールバック機能はサポートされていないようです。
LiquiBaseを使用すると、データベースに加えた変更を、自動的に、またはカスタムロールバックSQLを介して元に戻すことができます。ロールバックのサポートは、コマンドライン、Ant、Maven、およびGrailsで利用できます。
ただし、この設定ではロールバックが不可能であるとは信じがたいです。したがって、問題は、「ロールバックが機能しないのはなぜですか。また、ロールバックを機能させるにはどうすればよいですか?」です。
編集:
私は今、少し違う質問をするべきだったことに気づきました。私が望んでいるロールバックの種類は、移行時に問題が発生した場合に発生するロールバックです。
私はトランザクションを使おうとしましたが(これらは私が想定しているように)、これは期待した効果をもたらしませんでした。
うまくいかない変更セットの例:
<changeSet runInTransaction="true">
<createTable tableName="table1">
<column name="a" type="int"/>
</createTable>
<createTable tableName="table1">
<column name="a" type="int"/>
</createTable>
<createTable tableName="table2">
<column name="a" type="int"/>
</createTable>
</changeSet>
サンプルの変更セットを実行すると、Liquibaseはなんとかtable1を作成できますが、同じ名前で別のテーブルを作成しようとすると失敗します(明らかに)。作成されたテーブルは削除されず、データベースに保持されます。
Liquibaseのマニュアルを見ると、次のことに気づきました。
runInTransaction
changeSetは(可能であれば)単一のトランザクションとして実行する必要がありますか?デフォルトはtrueです。警告:この属性には注意してください。falseに設定され、複数のステートメントを含むchangeSetの実行の途中でエラーが発生した場合、LiquiBasedatabasechangelogテーブルは 1.9以降無効な状態のままになります。
MySQLを使用していますが、変更セットはMSSQLおよびOracleでも機能する必要があります。
私もSpringのトランザクションを使用していますが、これらは完璧に機能します。Liquibaseの素晴らしさとそれらの素晴らしさ(データベースに依存しない)トランザクションの両方を取得する方法についてのアイデアはありますか?