地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【MySQL】先頭のレコードより前、末尾のレコードより後

show engine innodb statusのロックモニターに出てくる用語。

  • 最大下限レコード(infimum record)
  • 最小上限レコード(supremum record)

先頭レコードよりも前にある疑似レコードと、末尾レコードより後にある疑似レコードを意味する。「先頭レコードより前」や「末尾レコードより後」のギャップロックを表現するために使われる。supremumはSELECTで空振ってしまうみたいなケースでよく見る機会があるんじゃないだろうか。

【MySQL】ギャップロックはデッドロックをするかもしれない

InnoDB のギャップロックは、「単に抑制的」です。つまり、ほかのトランザクションによるギャップへの挿入が停止されるだけです。したがって、ギャップ X ロックの効果はギャップ S ロックと同じです。

dev.mysql.com

タイトル通りそのまま。SELECT ~ FOR UPDATEが空振るとギャップロックを取るが例えば2トランザクションで同時に発生した場合にはどちらもロック待ちは発生せずに先に進めてしまう。先に進めた状態でどちらも排他ロックを取ろうとするとデッドロックを起こすという。

テーブル

CREATE TABLE `t1` (
`col_pk` int(11) NOT NULL AUTO_INCREMENT,
`col2` int(11) DEFAULT NULL,
`col3` varchar(10) DEFAULT NULL,
PRIMARY KEY (`col_pk`),
KEY `col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

トランザクションA

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2 where col_pk = 8 for update;
Empty set (0.00 sec)

mysql> insert into t2 values(9,10,100);
Query OK, 1 row affected (6.59 sec)

トランザクションB

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2 where col_pk = 8 for update;
Empty set (0.00 sec)

mysql> insert into t2 values(9,10,100);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

どうすりゃいいの?

空振らないように実装する(トレードオフあり)、アプリでリトライできるならリトライ。あとは分離レベルを変えてしまうのもファントムリードが発生しないので良さそう。

zenn.dev

Composer

Composerとは

PHPのライブラリ管理ツールです。 ライブラリAを使用するためには、別のライブラリBを先にインストールする必要がある、なんてことがあります。 この時、ライブラリAはライブラリBに依存している、と言います。 Composerを使用することで依存関係にあるライブラリをまとめてインストールすることができます。

Composerのインストール

Composerの公式サイトにアクセスして、Downloadをクリックしましょう。 各環境に合わせたインストール方法が表示されます。

Composer公式サイト https://getcomposer.org/

Macならbrewで簡単にインストールできます。 % brew install composer

インストールが完了したら-Vコマンドで正常にインストールされたことを確認しましょう。

% composer -V
Composer version 1.7.2 2018-08-16 16:57:12

Composerのセットアップ

Composerを使用するにはcomposer.jsonファイルを作成する必要があります。 composer.jsonは、プロジェクトにインストールしたいライブラリ情報を記述するファイルです。

composer.jsonはプロジェクトごとに作成します。