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

SQLAlchemy with_for_update行ロックが機能していませんか?

    2つのセッションは次のようになります。

    user = Student.query.with_for_update(of=Student, nowait=True).filter(Student.id == 122).first()
    user.type = 1
    db.session.commit()
    

    および

    user = Student.query.with_for_update(of=Student, nowait=True).filter(Student.id == 122).first()
    user.type -= 1
    db.session.commit()
    

    FOR UPDATEの場合 正しく機能するには、すべて 行を更新する予定の関連トランザクションは、それを使用する必要があります。

    あなたの例では、セッション2はwith_for_updateを使用していません 。 FOR UPDATEを使用するように指示しなかったため 、行の古い値を自由に読み取って(新しい値はまだコミットされておらず、ロックは純粋なリーダーをブロックしないため)、そのメモリ内の値を変更して、書き戻すことができます。

    FOR UPDATEを使用したくない場合 行を変更する意図で読み取るすべての場所で、代わりにisolation level serializableを使用できます。 どこにでも。ただし、そうすると、ブロックされない可能性がありますが、コミットするまで成功したように見え、その後、キャッチして処理する必要があるシリアル化エラーをスローします。

    注: 両方のセッションがwith_for_updateでラベル付けされているため、事前編集の例は機能しているはずです。 。




    1. アプリケーションでのMySQLクレデンシャルの非表示

    2. MySQLはクエリでORDERBYとLIMITをどのように処理しますか?

    3. MySQL用のPDOプリペアドステートメントを使用して、データの配列から複数の列に複数の値を挿入する

    4. 各行に一意のランダム番号を割り当てるMySQLクエリ