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

DBIx ::Class ::ResultSetのfind_or_createメソッドを使用するときに競合状態を回避するにはどうすればよいですか?

    いいえ、ドキュメントは正しくありません。トランザクションを単独で使用することはありません この問題を回避してください。例外が発生した場合にトランザクション全体がロールバックされることを保証するだけです。これにより、一貫性のない状態がデータベースに永続化されることはありません。

    回避する この問題は、トランザクションの終了時にすべてのロックが解放されるため、トランザクション内でテーブルをロックする必要があります。次のようなもの:

    BEGIN;
    LOCK TABLE mytbl IN SHARE MODE;
    
    -- do your find_or_create here
    
    COMMIT;
    

    しかし、それはすべての魔法の治療法ではありません。パフォーマンスの問題になる可能性があり、デッドロックが発生する可能性があります。 (他のリソースがすでにロックしているリソースを相互にロックしようとする並行トランザクション)。 PostgreSQLはそのような状態を検出し、競合するトランザクションの1つを除くすべてをキャンセルします。失敗したときに操作を再試行する準備をする必要があります。

    ロックに関するPostgreSQLのマニュアル。

    並行性があまりない場合は、問題を無視することもできます。タイムスロットは非常に小さいため、実際に発生することはめったにありません。害を及ぼさない重複キー違反エラーを見つけた場合は、これもカバーしています。



    1. SQL Serverのリンクサーバーからテーブル権限を返す(T-SQLの例)

    2. 1つのテーブルに値がない場合は、2つのテーブルを結合します

    3. org.json.JSONException:java.lang.String型の値<brをJSONObjectに変換できません

    4. SQL ServerでCREATEまたはALTERを実行するにはどうしますか?