2013-10-12 30 views
2

我想優化我的數據庫調用長耙子任務,所以我一直在分析每一個查詢。Rails何時用BEGIN和COMMIT換行插入?

我注意到Rails經常會用BEGINCOMMIT來包裝我的插入和更新。我沒有在任何地方使用.transaction,所以我很困惑爲什麼會發生這種情況。我禁用了我的after_saveafter_commit日誌記錄,但這似乎沒有效果。

任何想法?亞馬遜網絡服務測量每一個MySQL I/O,所以我想擺脫這些BEGINCOMMIT陳述。

謝謝!

+0

也許還有另一種方法優化你的耙子任務。你介意分享一些細節嗎? – Stefan

+0

最終,我的目標是減少AWS向我收取的MySQL I/O使用量。所以我認爲我可以通過刪除這些BEGIN/COMMIT調用來削減一些功能。 –

+0

爲什麼你的耙子任務有這麼多交易? – Stefan

回答

4

Rails將每個寫入操作包裝在一個事務中。例如:

Foo.create 
Foo.create 
Foo.create 

登錄:

(0.1ms) BEGIN 
SQL (6.9ms) INSERT INTO `foos` VALUES() 
(3.3ms) COMMIT 

(0.2ms) BEGIN 
SQL (8.0ms) INSERT INTO `foos` VALUES() 
(0.4ms) COMMIT 

(0.2ms) BEGIN 
SQL (7.3ms) INSERT INTO `foos` VALUES() 
(1.3ms) COMMIT 

如果您在explicit transaction包裝這些調用,Rails會使用該交易,而不是創建新的:

Foo.transaction do 
    Foo.create 
    Foo.create 
    Foo.create 
end 

登錄:

(0.2ms) BEGIN 
SQL (0.3ms) INSERT INTO `foos` VALUES() 
SQL (0.2ms) INSERT INTO `foos` VALUES() 
SQL (0.2ms) INSERT INTO `foos` VALUES() 
(6.7ms) COMMIT 
3

你實際上並不想擺脫它們。 Active Record在幕後做了很多魔術,因此當保存複雜的模型/關係時,事務包裝對於在出現問題時撤銷數據庫更改非常有用。

請注意,這與您使用.transaction無關。 Active Record會自動將常見操作(例如.save.update_attribute)包裝在數據庫事務中。

2

BEGIN和COMMIT不是重載,但是我必須說的是救世主。當出現問題時,它們可以幫助您回滾事務。雖然你還沒有使用.transaction,但它們默認被實現爲Rails的背景Magic。

如果您真的想在AWS服務上節省您的成本,請嘗試刪除不妨礙應用程序安全性或健壯性的事項。

相關問題