2011-03-21 65 views
2

我正在使用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) 

有沒有什麼辦法可以防止這種情況?我是否應該將每個陳述都放在一個遷移中並繼續前進?這就是我現在所處的位置。

在此先感謝。

回答

2

DML從不事務處理 - 立即應用。有沒有辦法回滾

+0

謝謝。這就是我想到的。所以在這一點上,我的問題的解決方案是每個遷移腳本只有一條語句。 – Dave 2011-03-25 17:56:19

+0

不完全正確。一些數據庫供應商允許將DDL操作作爲原子操作進行提交或回滾。 – 2011-05-23 23:04:32

+0

是的,感謝您的評論。我的例子是MySQL,所以MySQL的答案是正確的,但你也是正確的。我在另一個項目上使用PostgreSQL,大多數DDL操作都是事務性的。 – Dave 2011-05-24 12:40:55

相關問題