SKIP LOCKED
行ロックを取る際に、他のトランザクションがすでにロックしている行を待たずに読み飛ばすSQL句(FOR UPDATE SKIP LOCKED)。別のキューシステムを用意せず、データベースだけで信頼できるジョブキューを作るための土台になる。
問題設定はこうだ。複数のワーカープロセスがテーブルからジョブを取り出す。SKIP LOCKEDがないと、同じ行を取り合って衝突するか、順番待ちで止まってしまう。SELECT ... FOR UPDATE SKIP LOCKED LIMIT 1を使えば、各ワーカーはロックされていない次のジョブを取得でき、重複も待ちもなく綺麗に並列化できる。PostgreSQL(9.5以降)、MySQL(8.0以降)、Oracleが対応している。典型的な用途は「キューとしてのデータベース」で、単純なバックグラウンドジョブのためにRedisやRabbitMQを持ち込まずに済む。Riverのようなライブラリもこの仕組みの上に作られている。トレードオフとして、中程度の規模までは優秀だが、極端に高いスループットでは専用のキューシステムが必要になる。status列と、未処理行だけの部分インデックスを併用することが多い。