2012-12-04 35 views
2

我在使用Spring環境的項目中使用Liquibase。但是回滾功能似乎不起作用。 在春季環境中不能使用Liquibase交易

我懷疑,不支持回滾功能使用Spring運行Liquibase因爲the manual時說:

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的,但是當它試圖創建另一個表具有相同名稱的失敗(明顯)。創建的表格不會被刪除並保留到數據庫。

看着the Liquibase manual我注意到:

runInTransaction

如若變更跑出作爲單個事務(如果可能的話)?默認爲true。 警告:小心使用此屬性。如果設置爲false,並通過運行包含多個語句的變更發生錯誤的部分方式,LiquiBase databasechangelog表將處於無效狀態留給由於1.9

我使用MySQL,但是更改集必須與MSSQL和Oracle一起工作。

我還使用Spring的事務,而這些工作的完善,如何獲得Liquibase雙方迷死那些真棒(與數據庫無關)交易的任何想法?

回答

1

從我記得春天整合是遷移數據庫作爲一個後處理步驟。由於沒有交互式步驟,因此您無法指定命令,如「回滾一個變更集」。

對於像rollbacking正改變互動的步驟,你就需要使用CLI,或者通過Ant或Maven構建腳本。

帖子編輯

事務級回滾取決於基礎數據庫實現。有些與Oracle一樣,不允許在事務回滾期間回滾DDL命令(如create table)。我發現對於這些情況,最好將每個DDL語句放入其自己的更改集中,以防發生一次失敗。事實上,如果您針對現有數據庫運行generateChangeLog命令,則會發現Liquibase會爲每個DDL命令生成一個變更集。儘管如此,您仍然應該對其他類型的命令進行事務級恢復,例如插入等。

+0

我沒有問正確的問題。我已經解決了這個問題,請參閱我的修訂問題。 – siebz0r

+0

很好的解釋,謝謝;-) – siebz0r

+0

沒有問題...高興地幫助! –

1

根據doco,spring integration顯示旨在支持數據庫遷移。

執行回滾,您可以使用liquibase罐子如下(見command-line文檔):

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 ? 

數據庫的JDBC JAR和更改日誌都應該可以從WAR文件。

+0

我沒有問正確的問題。我已經解決了這個問題,請參閱我的修訂問題。 – siebz0r