アドバイザリロック
PostgreSQLの機能で、行やテーブルに紐づかないアプリケーション定義のロック。SELECT pg_advisory_lock(12345) のように使う。
DBはロックの状態を管理するだけで、その意味づけには関与せず、意味はアプリケーション側が決める。分散システムの調整手段として使える。
用途は、cronジョブを単一の実行者に限定する(1つのポッドがロックを取り、他は失敗する。ポッドが死ねばロックは自動で解放される)、アプリケーションレベルの資源ロック、リーダー選出など。行ロックと違い特定のデータに紐づかない。2キー版の pg_advisory_lock(class_id, obj_id) で名前空間を分けられる。ロックはセッション単位(切断で解放)かトランザクション単位。RedisのSETNX、etcdのリース、ZooKeeperの一時ノードも同じパターンだ。ロックのためだけにRedisを立てず、既存のPostgreSQLで済ませるのは分散アプリの定番手法になっている。