データベースに関する基礎知識を復習のためにまとめました。
ロック
ロックは、複数のトランザクションが同じデータを同時に更新しようとした場合に、それらのトランザクションが競合しないようにするための仕組みです。このような場合、1つのトランザクションが完了するまで、他のトランザクションはそのデータを参照・更新することができなくなります。これにより、データを同時に処理しても一貫性・正確性を保つことができます。ただし、ロックを利用する場合、データベースのパフォーマンスに影響を与えることがあるため、適切に使用する必要があります。
トランザクションについては【DB】データベースの基礎~トランザクション編~ を参照。
ロックの種類
共有(S)ロック
共有ロックは、複数のトランザクションが同じデータを同時に読み取ることを許すロックです。データがロックされている間は、他トランザクションはデータを読み込みは行えますが、書き込みはできなくなります。
下記のSQLは共有ロックがかけられます。
- トランザクション内での
SELECT ~ LOCK IN SHARE MODE
の実行
排他(X)ロック
排他ロックは、1つのトランザクションへの独占的なロック。データがロックされている間は、他トランザクションはデータを読み込み、書き込みはできない。
下記のSQLは占有ロックがかけられます。
- トランザクション内での
SELECT ~ FOR UPDATE
の実行 - トランザクション内での
UPDATE
の実行
ロックの手法
インデックロック(レコードロック)
インデックスレコードです。小さい範囲でロックすることにより、他のトランザクションへの影響が小さくなります。
ロックを行う際に、単一のINDEX
、UNIQUE
が指定されている場合インデックスロックになります。
ただし、のインデックに存在しない値を指定した場合、ギャップロックになる場合もあります。
テーブルロック
ギャップロック
インデックスとインデックスの間にかけられるロック、または先頭のインデックスレコードの前や末尾のインデックスレコードのあとにかかるのロックです。
複数のINDEX
が指定されたり、INSERT
には一種のギャップロックがかけられます。
ネクストキーロック
インデックスロックとギャップロックを組み合わせたものです。