実際、これはまさにネストされたトランザクションの方法です。 のために設計されました。オラクルのドキュメントから引用します:
したがって、通常のネストされたトランザクションの子トランザクション 彼や他の子供や親がどのように行動するかについては何も言いません(より大きな取引 )相互データを変更したり、例外で失敗したりする以外の動作をする可能性があります。
ただし、彼に許可することはできます(子トランザクション )sub-transaction
を利用することで、彼の運命についての投票のチャンスは非常に限られています。 rails ドキュメント
に記載されている機能 requires_new: true
を渡すことによって
User.transaction do
User.create(username: 'Kotori')
User.transaction(requires_new: true) do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
ドキュメントが言うように、これは「ことり」のみを作成します。強力な「ネム」の子供が黙って死ぬことを選んだので。
ネストされたトランザクションルールの詳細 ( oracle docs )
更新:
レールがnested transactions
である理由をよりよく理解するため このように機能するため、ネストされたトランザクションがDBレベルでどのように機能するかについてもう少し知る必要があります。
では、ドキュメントでnested transactions
の動作について説明します 上記の2つの場合:
ネストされた呼び出しの場合、 #transaction 次のように動作します:
-
ブロックは何もせずに実行されます。ブロック内で発生するすべてのデータベースステートメントは、すでに開いているデータベーストランザクションに効果的に追加されます。
-
ただし、:requires_newが設定されている場合、ブロックはサブトランザクションとして機能するデータベースセーブポイントにラップされます。
私は注意して想像するだけです それ:
オプション(1) (なし require_new)nested transactions
を完全にサポートするDBMSを使用した場合にあります または、nested_attributes
の「偽の」動作に満足しています
option(2) savepoint
をサポートすることです そうでない場合の回避策。