交易加快处理速度

时间:2012-04-05 21:46:01

标签: ruby-on-rails ruby transactions

当我看到这段代码时,我正在阅读Agile Web Development With Rails:

Order.transaction do (1..100).each do |i|
    Order.create(:name => "Customer #{i}", :address => "#{i} Main Street",
      :email => "customer-#{i}@example.com", :pay_type => "Check")
end end

作者说:“请注意,此代码在一次交易中完成所有这些工作。这不是这项活动所必需的,但确实加快了处理速度。”

所以我的问题是,为什么事务会加速处理这段代码?

2 个答案:

答案 0 :(得分:1)

因为您在与db的一次交互中发生了100次创建,而不是100次单独的交互。减少对数据库的命中通常会更快,因为您可以降低与通信相关的成本。

答案 1 :(得分:1)

在这两种情况下,rails应用程序都会生成100个单独的INSERT语句,但如果您没有显式创建事务,则每个更新/插入都位于其自己的事务中。事务应该是ACID,特别是D代表持久性:一旦提交了事务,即使在1纳秒后发生电源故障,也很难保证它已成功写入磁盘。

因此,提交事务需要刷新具有固有成本的写入(这可以通过正确类型的RAID硬件来缓解)。另一方面,当您处于一个大事务的中间时,数据库没有义务在单个插入后刷新写入。

相关问题