2013-01-10 53 views
0

我有一個遷移,我正在改變MySQL表的字符集,從latin1到utf-8。之後,我試圖以某種方式改變對象。我希望如果一個對象無法保存以回滾數據庫,包括字符集更改。這裏是我的代碼:執行語句是否異常回滾?

def up 
    execute "ALTER TABLE posts CONVERT TO CHARACTER SET utf-8;" 
    posts = Post.find_each do |post| 
    # modify post.content 
    post.save! 
    end 
    raise "rollback" 
end 

我做了raise "rollback"因爲我想測試,並確保遷移工作成功地。但是,如果我在遷移回滾之後執行show create table posts,則會看到它的字符集仍然是utf-8。執行語句是否未包含在事務中?

+0

所有DDL語句執行隱式提交,您無法將它們回滾。 –

回答

3

alter table在mysql中執行implicit commit。您無法回滾alter

+0

雖然很奇怪......似乎我的帖子對象仍然被修改。在運行遷移之前,我有280個需要更改的帖子。運行後,我有0 ...即使我拋出異常觸發回滾。你知道會發生什麼嗎? – Geo

+0

您的示例中沒有事務回滾 –

+0

缺省情況下Rails遷移是否在事務中運行? – Geo

相關問題