実現したいこと
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
以上。