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

いつアップデートロックとロック解除を選択しますか?

    ロックは、コマンドの実行中(通常は先頭またはその近く)に取得されます。ロック(アドバイザリロックを除く)はのみ解放されます トランザクションがコミットまたはロールバックしたとき。 FOR UNLOCKはありません 、UNLOCKもありません テーブルレベルのLOCKの効果を元に戻すコマンド 指図。これはすべて、PostgreSQLドキュメントの同時実行制御セクションで説明されています。

    ロックを解除するには、トランザクションをコミットまたはロールバックする必要があります。

    さらに、「この行は別の並行トランザクションによってすでに削除されているか」と尋ねるのは実際には意味がありません。行を削除したトランザクションがコミットするまで実際には削除されません...その場合でも、行を削除して再挿入したか、別の同時トランザクションによって行が再度挿入された可能性があります。

    たまたまタスクキューまたはメッセージキューシステムを構築していますか。そうすれば、その問題は解決され、その異常に複雑なホイールを再発明しようとすべきではないからです。 PGQ、ActiveMQ、RabbitMQ、ZeroMQなどを参照してください(将来のPostgreSQLバージョンには、FOR UPDATE SKIP LOCKEDが含まれる可能性があります。 これはテスト中ですが、執筆時点ではリリースされていません。

    解決しようとしている根本的な問題のより詳細な説明を含む新しい質問を投稿することをお勧めします。問題の解決策は、「行がすでに削除されているかどうかを確認する」または「行のロックを解除する」ことであると想定しています。それはおそらく実際には解決策ではありません。プッシュバイクが動かないときに「ガソリンはどこで買えるの?」と言う人がいるので、燃料がなくなったと思っているようなものです。燃料は問題ではありません。問題は、プッシュバイクが燃料を受け取らないため、ペダルを踏まなければならないことです。

    背景を説明してください。達成しようとしていることを説明してください。何よりも、擬似コードを投稿しないでください。問題が発生している実際のコードを投稿してください 、できれば自己完結型で実行可能な形式で。




    1. DockerPostgresのスクリプトでユーザー/データベースを作成する方法

    2. OracleRACの観点から見たSQLServerクラスタリング

    3. ClusterControl-高度なバックアップ管理-PostgreSQL

    4. SQLServerでDMLトリガーを作成する