前回のブログで、MySQLとPostgreSQLの基本的なロックに関してはまとめたので、ここでは、MySQL8.0から加わっている。SKIP LOCKEDとNOWAITオプションについて追記します。
MySQL8.0 (NOWAIT and SKIP LOCKED)
WL#3597: Implement NOWAIT and SKIP LOCKED
WL#8919: InnoDB: Implement NOWAIT and SKIP LOCKED
これまでの挙動としては、LOCK TIMEOUT待ちが主なレスポンスでした。
MySQL8.0では、以下オプションが利用可能です。
- for update of <table名> SKIP LOCKED; /*** ロックされた行を非決定論的にスキップします ***/
- for share of <table名> NOWAIT; /*** 行がすでにロックされている場合はすぐにエラーになります ***/
小さいテーブルだと、インデックスが使われず。テーブル全体のデータもロックされていて分かり難いので、大きなテーブルで再確認してみます。
通常のロックは、innodb_lock_wait_timeoutの値待ち。NOWAITは即時エラーになります。
SKIP LOCKEDの場合、以下の様にロックがかかったデータをSKIPして、ロックがかかっていないデータのみ表示している様子が確認出来ます。以下の例では、更新対象の行 ( id > 1 and id < 10のデータがSKIPされている事が分かります。)