大きなテーブルを更新しようとしているのですが、ロックについて心配する必要があるかどうか疑問に思っています。
次のようなテーブルがあります。
CREATE TABLE "ItemsToProcess"(
"id" text,
"WorkerInstanceId" text,
"ProcessingStartTime" timestamp with time zone,
"UpdatedTime" timestamp with time zone,
CONSTRAINT "ITP_PK" PRIMARY KEY ("id")
)WITH (
OIDS=FALSE
);
当初、このテーブルには約 200 万行があり、id
列のみが入力されていますWorkerInstanceId
。2 つのタイムスタンプはNULL
、デフォルトで実行開始時のものです。
何が起こるかというと、一部のワーカー アプリ (少なくとも 2 つですが、本番環境では約 10 ~ 13 になる予定です) が、このテーブルから ID のバッチ (batchSize を 200 に設定する予定です) をマークして処理できるようにします。処理中に何が起こるかは、今ではあまり重要ではありません。
バッチのマーキングは次のようになります。
UPDATE "ItemsToProcess"
SET "WorkerInstanceId" = ?, "ProcessingStartTime" = current_timestamp()
WHERE "WorkerInstanceId" is NULL
LIMIT 200;
私の質問は、更新を行う前に、更新しようとしている行をロックすることについて心配する必要がありますか?
Postgre のドキュメントには次のように書かれています。
行排他
SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、および ACCESS EXCLUSIVE ロック モードと競合します。
コマンド UPDATE、DELETE、および INSERT は、(他の参照テーブルに対する ACCESS SHARE ロックに加えて) ターゲット テーブルでこのロック モードを取得します。一般に、このロック モードは、テーブル内のデータを変更するコマンドによって取得されます。
したがって、ワーカーの 1 人がこの更新を行うたびに、テーブル全体がロックされ、200 行が更新され、最終的にロックが解放されると思います。ロックが設定されるまで、他のワーカーはロックが解放されるのを待ちます。これは正しいですか、それとも何か不足していますか?