(休止状態の) レールを使用する場合、トランザクションはいつ開始されますか
-
02-07-2019 - |
質問
RESTful動詞全体が単一のすべてを含むトランザクションの下にある場合ですか?つまり、UPDATE、DELETE、または CREATE 操作の処理中の任意の時点で検証またはコールバックでエラーが発生した場合、以前のコールバックで実行したすべてのデータベース操作もロールバックされますか?簡潔に言うと、コールバックまたは検証でエラーが発生すると、その動詞アクションのデータベースにまったく変化が起こらなくなるのでしょうか?
解決
RESTful動詞全体が単一のすべてを含むトランザクションの下にある場合ですか?
いいえ
UPDATE、DELETE、または CREATE 操作の処理中の任意の時点で検証またはコールバックでエラーが発生した場合、以前のコールバックで実行したすべてのデータベース操作もロールバックされますか?
いいえ。
コールバックまたは検証でエラーが発生すると、その動詞アクションのデータベースにまったく変更が発生しなくなりますか?
いいえ。
この動作が必要な場合は、コントローラーで明示的にトランザクションを作成するか (他のユーザーが提供する例を参照)、 around_filter
すべての安静な行動にその行動を結びつけることです。
他のヒント
デフォルトでは、トランザクション内にデータベース コードは記述されていないため、コード内でそれを行うように指示する必要があります。
def create
Model.transaction do
Model.create!(params[:model])
Model.association.create!(params[:association])
end
rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
flash[:notice] = "That record could not be saved."
render :action => "new"
end
#create を使用してください!メソッドはレコードの保存を試み、失敗すると例外を発生させ、トランザクション ブロック内で既に実行されたコードをロールバックします。
アクションを救出しないと、パブリック ディレクトリに 405.html (存在すると思われる) にリダイレクトされます。
一部のメソッド (作成、破棄) はデータベースに即座に送信されます。トランザクションは、次のように ActiveRecord から派生したクラスでトランザクション メソッドを使用して発生します。
Student.transaction do
Course.transaction do
course.enroll(student)
student.units += course.units
end
end
(この例は複数のデータベースを対象としています。単一データベースの場合、必要なトランザクションは 1 つだけです。)
これらのトランザクションをロールバックすると、トランザクション内でスローされた例外がロールバック後に伝播されます。
これは、データベースにトランザクションがあるかどうかによって異なります。
注意:save と destroy はトランザクションにラップされます。