我正在尝试针对长时间的 rake 任务优化我的数据库调用,因此我一直在分析每个查询。
我注意到 Rails 经常用 BEGIN
和 COMMIT
包装我的插入和更新。我没有在任何地方使用 .transaction
所以我很困惑为什么会这样。我已经禁用了我的 after_save
和 after_commit
日志记录,但这似乎没有效果。
有什么想法吗? Amazon Web Services 测量每一个 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
关于mysql - Rails 何时使用 BEGIN 和 COMMIT 包装插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340345/