2

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の素晴らしさとそれらの素晴らしさ(データベースに依存しない)トランザクションの両方を取得する方法についてのアイデアはありますか?

4

2 に答える 2

1

春の統合は、後処理ステップとしてデータベースを移行するためのものであることを思い出します。インタラクティブな手順がないため、「1つのチェンジセットをロールバックする」などのコマンドを指定する機会はありません。

n-changesのロールバックなどのインタラクティブな手順では、CLIを使用するか、AntまたはMavenを介してビルドスクリプトを使用する必要があります。

ポストエディット

トランザクションレベルのロールバックは、基盤となるデータベースの実装によって異なります。Oracleのように、トランザクションのロールバック中にDDLコマンド(テーブルの作成など)をロールバックすることを許可しないものもあります。これらの場合、失敗した場合に備えて、各DDLステートメントを独自のチェンジセットに入れるのが最善であることがわかりました。実際、既存のデータベースに対してgenerateChangeLogコマンドを実行すると、Liquibaseが各DDLコマンドのチェンジセットを生成することがわかります。ただし、挿入などの他のタイプのコマンドについては、トランザクションレベルの回復が必要です。

于 2012-12-04T21:56:31.657 に答える
1

ドコによると、春の統合はデータベースの移行をサポートするように設計されているようです。

ロールバックを実行するには、次のようにliquibase jarを使用できます(コマンドラインドキュメントを参照)。

java -jar liquibase.jar \
      --driver=oracle.jdbc.OracleDriver \
      --classpath=website.war \
      --changeLogFile=com/example/db.changelog.xml \
      --url=jdbc:oracle:thin:@localhost:1521:oracle \
      --username=scott \
      --password=tiger \
      rollbackCount ?

データベースのJDBCjarおよび変更ログはすべてWARファイルから利用できる必要があります。

于 2012-12-04T22:21:07.560 に答える