mysql – Rails什么时候用BEGIN和COMMIT包装插入?

我正在尝试优化我的数据库调用以进行长期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包装插入? - 代码日志