我正在尝试优化我的数据库调用以进行长期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
原文地址:https://codeday.me/bug/20190718/1492130.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。