我想優化我的數據庫調用長耙子任務,所以我一直在分析每一個查詢。Rails何時用BEGIN和COMMIT換行插入?
我注意到Rails經常會用BEGIN
和COMMIT
來包裝我的插入和更新。我沒有在任何地方使用.transaction
,所以我很困惑爲什麼會發生這種情況。我禁用了我的after_save
和after_commit
日誌記錄,但這似乎沒有效果。
任何想法?亞馬遜網絡服務測量每一個MySQL I/O,所以我想擺脫這些BEGIN
和COMMIT
陳述。
謝謝!
我想優化我的數據庫調用長耙子任務,所以我一直在分析每一個查詢。Rails何時用BEGIN和COMMIT換行插入?
我注意到Rails經常會用BEGIN
和COMMIT
來包裝我的插入和更新。我沒有在任何地方使用.transaction
,所以我很困惑爲什麼會發生這種情況。我禁用了我的after_save
和after_commit
日誌記錄,但這似乎沒有效果。
任何想法?亞馬遜網絡服務測量每一個MySQL I/O,所以我想擺脫這些BEGIN
和COMMIT
陳述。
謝謝!
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
你實際上並不想擺脫它們。 Active Record在幕後做了很多魔術,因此當保存複雜的模型/關係時,事務包裝對於在出現問題時撤銷數據庫更改非常有用。
請注意,這與您使用.transaction
無關。 Active Record會自動將常見操作(例如.save
和.update_attribute
)包裝在數據庫事務中。
BEGIN和COMMIT不是重載,但是我必須說的是救世主。當出現問題時,它們可以幫助您回滾事務。雖然你還沒有使用.transaction
,但它們默認被實現爲Rails的背景Magic。
如果您真的想在AWS服務上節省您的成本,請嘗試刪除不妨礙應用程序安全性或健壯性的事項。
也許還有另一種方法優化你的耙子任務。你介意分享一些細節嗎? – Stefan
最終,我的目標是減少AWS向我收取的MySQL I/O使用量。所以我認爲我可以通過刪除這些BEGIN/COMMIT調用來削減一些功能。 –
爲什麼你的耙子任務有這麼多交易? – Stefan