当我看到这段代码时,我正在阅读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
作者说:“请注意,此代码在一次交易中完成所有这些工作。这不是这项活动所必需的,但确实加快了处理速度。”
所以我的问题是,为什么事务会加速处理这段代码?
答案 0 :(得分:1)
因为您在与db的一次交互中发生了100次创建,而不是100次单独的交互。减少对数据库的命中通常会更快,因为您可以降低与通信相关的成本。
答案 1 :(得分:1)
在这两种情况下,rails应用程序都会生成100个单独的INSERT语句,但如果您没有显式创建事务,则每个更新/插入都位于其自己的事务中。事务应该是ACID,特别是D代表持久性:一旦提交了事务,即使在1纳秒后发生电源故障,也很难保证它已成功写入磁盘。
因此,提交事务需要刷新具有固有成本的写入(这可以通过正确类型的RAID硬件来缓解)。另一方面,当您处于一个大事务的中间时,数据库没有义务在单个插入后刷新写入。