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

著者は次のように述べています。「このコードは1つのトランザクションでこのすべての作業を実行します。これはこのアクティビティに正確に必要なわけではありませんが、処理を高速化します」。

だから私の質問は、なぜトランザクションがこのコードブロックの処理をスピードアップするのかということです。

4

2 に答える 2

1

どちらの場合も、Railsアプリは100個の個別のINSERTステートメントを作成しますが、トランザクションを明示的に作成しない場合、各更新/挿入は独自のトランザクション内に配置されます。トランザクションはACIDであると想定され、特にDは耐久性を表します。トランザクションがコミットされると、1ナノ秒後に電源障害が発生した場合でも、トランザクションがディスクに正常に書き込まれることが保証されます。

したがって、トランザクションをコミットするには、書き込みをフラッシュする必要がありますが、これには固有のコストがかかります(これは、適切な種類のRAIDハードウェアによって軽減できます)。一方、1つの大きなトランザクションの最中にある場合、データベースには、個々の挿入後に書き込みをフラッシュする義務はありません。

于 2012-04-05T22:30:38.527 に答える
0

100の個別のインタラクションではなく、dbとの1つのインタラクションで発生する100の作成があるためです。通信に特に関連するコストを削減できるため、通常、データベースへのヒットが少ないほど高速になります。

于 2012-04-05T21:50:46.160 に答える