0

当我看到这段代码时,我正在阅读使用 Rails 进行敏捷 Web 开发:

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

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

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

4

2 回答 2

1

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

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

于 2012-04-05T22:30:38.527 回答
0

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

于 2012-04-05T21:50:46.160 回答