MySQL間隙ロックの発生条件は?

MySQLのギャップロック(Gap Lock)は、同時実行トランザクションが同じギャップデータの挿入を防止することにより、データの一貫性を保証するために使用されます。ギャップロックのトリガー条件には以下のケースがあります。

  1. 同一の隔離レベルにおいて1トランザクションが間隙に共有ロックまたは排他ロックを持っている場合、他のトランザクションは、その間隙に新たなデータを挿入することはできない。言い換えると、同一のトランザクションが間隙に共有ロックまたは排他ロックを持っており、その間隙以前・以後に他の既存データが存在しない場合は、他のトランザクションは、その間隙に新たなデータを挿入することはできない。
  2. 繰り返し可能読み込みトランザクション・アイソレーション・レベルのとき、あるトランザクションがギャップに共有ロックをかけている場合、別のトランザクションはそのギャップ内に新しいデータを挿入することはできない。言い換えると、あるトランザクションがギャップに共有ロックをかけていて、そのギャップの前後に別のデータがなければ、別のトランザクションはそのギャップに新しいデータを挿入することはできない。
  3. リピートリードトランザクション分離レベルでは、あるトランザクションが特定のギャップ排他ロックを取得している場合、それ以降のトランザクションはそのギャップ中に新しいデータを挿入できず、ギャップの前後にも新しいデータを挿入できない。つまり、あるトランザクションがギャップの排他ロックを取得しており、ギャップの前後他にすでに挿入されているデータが存在しない場合は、それ以降のトランザクションはそのギャップ中に新しいデータを挿入できず、ギャップの前後にも新しいデータを挿入できない。

なお、ギャップロックが効くのは、リピートリード可能なトランザクション分離レベルの場合のみであり、リードコミット可能なトランザクション分離レベルにはギャップロックは存在しません。

bannerAds