MySQL8.0におけるSKIP LOCKED

SKIP LOCKED

前回のブログで、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待ちが主なレスポンスでした。

LOCK Wait and Timeout

MySQL8.0では、以下オプションが利用可能です。

  • for update of <table名> SKIP LOCKED; /*** ロックされた行を非決定論的にスキップします ***/
  • for share of <table名> NOWAIT; /*** 行がすでにロックされている場合はすぐにエラーになります ***/
NOWAIT and SKIP LOCKED
小さいテーブルだと、インデックスが使われず。テーブル全体のデータもロックされていて分かり難いので、大きなテーブルで再確認してみます。

通常のロックは、innodb_lock_wait_timeoutの値待ち。NOWAITは即時エラーになります。

innodb_lock_wait_timeout

SKIP LOCKEDの場合、以下の様にロックがかかったデータをSKIPして、ロックがかかっていないデータのみ表示している様子が確認出来ます。以下の例では、更新対象の行 ( id > 1 and id < 10のデータがSKIPされている事が分かります。)

SKIP LOCKED

参照:15.7.2.4 読取りのロック

カテゴリー:

最近のコメント

表示できるコメントはありません。