ロック
#db
概要
トランザクション、分離レベルを理解するために、まずこのロックという仕組みを完璧に理解する必要がある。
単にロックと言っても、色んな知識が詰まっており、一筋縄じゃいかない。
あらゆる面からロックを理解して、解像度を上げていこう。
ロックとは
あるトランザクションがデータを触る時に、他トランザクションがそのデータを触るのを制限する仕組み。
「鍵をかける」といったイメージ。
排他ロック/共有ロック重要.icon
一般的なDBMSには主に2つのロック方式が存在する。
この2つのロックが、トランザクションを実現する上でとても大切なので違いを理解しておく。
① 排他ロック(FOR UPDATE)
このロックを取得した場合、他トランザクションの対象データに対する書き込み及び読み込みを禁止する。
通称「書き込みロック」
② 共有ロック(LOCK IN SHARE MODE)
このロックを取得した場合、他トランザクションからの書き込みを禁止する。
読み込みは可能となる。
通称「読み込みロック」
占有ロックとも言う
https://scrapbox.io/files/63aafe5b73051c001db382d1.png
ロックの対象となるデータ範囲
レコード
テーブル
データベース
コラム:楽観ロックと悲観ロック
これらは、共有ロックのようなDBMSの機能の話ではなく、アプリケーション側の戦略・考え方の話。
悲観ロック
DB側のロック機能をガッツリ使って、排他制御をしっかり行っていこうと言う考え方。
楽観ロック
DB側のロックは使わずに、楽観的にアプリ側でサクッと整合性チェックしようという考え方。
参考:
楽観ロック(楽観的排他制御)とは - ITを分かりやすく解説
排他制御(楽観ロック・悲観ロック)の基礎  - Qiita
その他参考
mysql - 悲観的ロックとトランザクション分離レベルの関係性がよくわからない - スタック・オーバーフロー
排他ロックとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
データベースの「ロック」という概念は2種類ある - Qiita
データを保護するロックの仕組み
DBのロックについてあまり意識したことがない人に向けた実は覚えておきたいロックについての知識 - CARTA TECH BLOG
hr.icon
DBのロックについてあまり意識したことがない人に向けた実は覚えておきたいロックについての知識 - CARTA TECH BLOG
ロックには2つの種類が存在する
排他ロックと共有ロック
排他ロック: 基本的には他のSQL実行をブロックするロック
共有ロック: 排他ロックを取得するようなSQL実行をブロックするが、共有ロックを取得するSQL実行までは許可するロック
table:
共有ロック 排他ロック
共有ロック OK NG
排他ロック NG NG
まあまあ、こんな感じよなonigiri.w2.icon
q.icon 排他ロックとか共有ロックってどのタイミングで取得されてるんやろ?具体的にどのDMLで取得してる?BEGINの時には既に?
a.icon
排他ロック:UPDATE、INSERTなど
共有ロック:(MySQL)SELECT LOCK IN SHARE MODE
SELECTには2つのロックレベルが存在する
共有ロック:Lock In Share Mode
このロック読み取りを使用するとトランザクションが終了されるまで共有ロックを継続して取得し続けます。 例えば他のプロセスから対象のデータを取得されるのはいいが更新削除はされたくない時に使用します。
code: sample
mysql> BEGIN;
mysql> SELECT * FROM t WHERE id = 1 LOCK IN SHARE MODE;
-- 他プロセスからの共有ロックは取得可能
-- MYSQL> SELECT * FROM t WHERE id = 1 LOCK IN SHARE MODE;
-- 他のプロセスから上記のデータを更新、削除しようとしても共有ロックを取得されているのでブロックされる
-- MYSQL> UPDATE t SET val = 2 WHERE id = 1;
mysql> COMMIT;
-- トランザクションが終了すると共有ロックが解除される
なるほどなぁ!!onigiri.w2.icon
SELECTする際は明示的に共有ロックを取得するのね
q.icon 普通のSELECT文はロックを取得しないのかな?
a.icon 基本的には普通のSELECT分はロックを取得しない
MySQLの場合、分離レベルがSERIALIZABLEだと、トランザクション内でのSELECTは、共有ロックを自動で取得するようになる。