実現したいこと

SELECT する時に他のトランザクションでロックされている行をスキップしたい。

つまり、あるスレッドのトランザクション中にテーブル内の複数行をロックしたら、他のスレッドのトランザクションではロックの終了を待たずに、その行を除いた範囲から SELECT したい。

データベースの機能

Oracle

Oracle は SKIP LOCKED でロックされた行をスキップする。
SELECT FOR UPDATE - オラクル・Oracle SQL 入門

PostgreSQL

PostgreSQL は SKIP LOCKED でロックされた行をスキップする。2016年1月リリースの PostgreSQL 9.5 から利用可能。
PostgreSQLのSKIP LOCKEDを使ってテーブルをキューとして使用する - Enjoy*Study

SQL Server

SQL Server は READPAST でロックされた行をスキップする。
排他制御メカニズムから“待ち”原因を究明する:Dr. K’s SQL Serverチューニング研修(4) - @IT

DB2

DB2 は SKIP LOCKED DATA でロックされた行をスキップする。
不完全な結果を許容するアプリケーションの並行性の改善 IBM Knowledge Center

MySQL

さて、MySQLは・・・、おや・・・無い。
SELECT FOR UPDATE も、SELECT LOCK IN SHARE MODE も、どのレベルのロックを掛けるかの制御であって、「ロックされた行をスキップする」という機能は無い。

ロック用のカラム作って検索で頑張る方向らしい。
FOR UPDATE SKIP LOCKED - Oracle to MySQL Migration - SQLines Open Source Tools

MySQL8.0.1 から、SKIP LOCKED が使えるようになる。
MySQL 8.0.1: Using SKIP LOCKED and NOWAIT to handle hot rows | MySQL Server Blog

以上。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.