mysql - Rails 何时使用 BEGIN 和 COMMIT 包装插入?

标签 mysql ruby-on-rails ruby amazon-web-services

我正在尝试针对长时间的 rake 任务优化我的数据库调用,因此我一直在分析每个查询。

我注意到 Rails 经常用 BEGINCOMMIT 包装我的插入和更新。我没有在任何地方使用 .transaction 所以我很困惑为什么会这样。我已经禁用了我的 after_saveafter_commit 日志记录,但这似乎没有效果。

有什么想法吗? Amazon Web Services 测量每一个 MySQL I/O,所以我想摆脱这些 BEGINCOMMIT 语句。

谢谢!

最佳答案

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/

相关文章:

ruby-on-rails - 使用 Devise gem 设置 MailyHerald(错误 : NoMethodError at/user)

ruby-on-rails - Rails 获取序列化模型记录

ruby - 在tomcat6上运行jruby的安全问题

ruby - Ruby 中的有限矩阵

ruby-on-rails - 使用 eventmachine 设置并发网络套接字

mysql - rails 连接 2 个表 HABTM

mysql - 按月分组统计结果

mysql - 如何在 servlet 中使用带有 session 值的 where 子句

mysql - 对字段进行分组并创建新列的 SQL 命令

mysql - rails 中的电子邮件激活