我正在使用Mybatis遷移工具來將架構維護到我們的數據庫,但我遇到以下問題。在Mybatis遷移工具中的一個事務中運行多個mysql語句
目前,如果我們在遷移中使用多個語句,它們每個都在單獨的事務中運行。因此,如果我想將兩個表(或者運行多個語句)作爲功能的一部分並且其中一箇中斷,那麼首先運行的任何內容都必須手動還原。但是,如果所有語句都已成功完成,則mybatis遷移只會在更改日誌表中標記爲完整。
這實在令人沮喪,因爲如果整個遷移不是自治的,那麼就無法保持常量db狀態。
設置
這裏的(相關)設置的MyBatis mygration我們的測試數據庫。
## JDBC connection properties.
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/gamealert_test?allowMultiQueries=true
username=gamealert
password=********
# If set to true, each statement is isolated
# in its own transaction. Otherwise the entire
# script is executed in one transaction.
auto_commit=false
# This controls how statements are delimited.
# By default statements are delimited by an
# end of line semicolon. Some databases may
# (e.g. MS SQL Server) may require a full line
# delimiter such as GO.
delimiter=;
full_line_delimiter=false
# This ignores the line delimiters and
# simply sends the entire script at once.
# Use with JDBC drivers that can accept large
# blocks of delimited text at once.
send_full_script=true
我添加AUTO_COMMIT =假,企圖以保持整個遷移在一個事務send_full_script =真實allowMultiQueries =真(以URL)。
是否有任何我需要用來允許這個mysql的url參數?這甚至有可能嗎?看起來應該是這樣。也許我們只需要爲每條語句創建一個遷移,但似乎過多。
例
這裏澄清一個進一步的例子
實例遷移20110318154857_fix_daily_sales:
--// fix daily_sales naming
-- Migration SQL that makes the change goes here.
ALTER TABLE `daily_sales` CHANGE COLUMN `storeId` `store_id` INT(10) UNSIGNED NOT NULL;
b0rked;
--//@UNDO
-- SQL to undo the change goes here.
... undo sql here ....
如果我跑了遷移失敗,因爲b0rked;
行的預期。 遷移狀態顯示遷移未按預期進行。
20110318130407 2011-03-18 17:06:24 create changelog
20110318144341 2011-03-18 17:06:30 fix schedule naming
20110318154857 ...pending... fix daily sales naming
但是我的數據庫應用了更改! 不好!
describe daily_sales;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| store_id | int(10) unsigned | NO | PRI | NULL | |
| sale_date | date | NO | PRI | NULL | |
| type_id | int(10) unsigned | NO | PRI | NULL | |
| tokens | int(10) unsigned | NO | | 0 | |
| dollars | double | NO | | 0 | |
+-----------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
有沒有什麼辦法可以防止這種情況?我是否應該將每個陳述都放在一個遷移中並繼續前進?這就是我現在所處的位置。
在此先感謝。
謝謝。這就是我想到的。所以在這一點上,我的問題的解決方案是每個遷移腳本只有一條語句。 – Dave 2011-03-25 17:56:19
不完全正確。一些數據庫供應商允許將DDL操作作爲原子操作進行提交或回滾。 – 2011-05-23 23:04:32
是的,感謝您的評論。我的例子是MySQL,所以MySQL的答案是正確的,但你也是正確的。我在另一個項目上使用PostgreSQL,大多數DDL操作都是事務性的。 – Dave 2011-05-24 12:40:55