sql >> データベース >  >> RDS >> Mysql

Railsが(疑似)ネストされたトランザクションでロールバックを無視するのはなぜですか?

    実際、これはまさにネストされたトランザクションの方法です。 のために設計されました。オラクルのドキュメントから引用します:

    したがって、通常のネストされたトランザクションの子トランザクション 彼や他の子供や親がどのように行動するかについては何も言いません(より大きな取引 )相互データを変更したり、例外で失敗したりする以外の動作をする可能性があります。

    ただし、彼に許可することはできます(子トランザクション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レベルでどのように機能するかについてもう少し知る必要があります。 rails api docs :

    では、ドキュメントでnested transactionsの動作について説明します 上記の2つの場合:

    ネストされた呼び出しの場合、 #transaction 次のように動作します:

    • ブロックは何もせずに実行されます。ブロック内で発生するすべてのデータベースステートメントは、すでに開いているデータベーストランザクションに効果的に追加されます。

    • ただし、:requires_newが設定されている場合、ブロックはサブトランザクションとして機能するデータベースセーブポイントにラップされます。

    私は注意して想像するだけです それ:

    オプション(1)なし require_new)nested transactionsを完全にサポートするDBMSを使用した場合にあります または、nested_attributesの「偽の」動作に満足しています

    option(2) savepointをサポートすることです そうでない場合の回避策。



    1. ビューcodeigniterにクエリ結果を表示できません

    2. SQL Server数学関数(完全なリスト)

    3. SQL Serverでのdatetimeとdatetimeoffsetの違い:違いは何ですか?

    4. mysqlの並べ替えとランキングステートメント