S/Xロック・粒度・2PL・楽観的ロックを完全網羅
複数のトランザクションが同じデータに同時アクセスするときに更新の競合を防ぐ排他制御の仕組み。データの整合性を保ちながら並行性を管理する。
| 種類 | 別名 | 取得操作 | S と両立 | X と両立 |
|---|---|---|---|---|
| S ロック(共有) | 読み取りロック | SELECT ... FOR SHARE | ✅ 可 | ❌ 不可 |
| X ロック(排他) | 書き込みロック | UPDATE/DELETE/SELECT FOR UPDATE | ❌ 不可 | ❌ 不可 |
| 粒度 | 並行性 | ロック管理コスト | 用途 |
|---|---|---|---|
| データベースロック | 最低 | 最低 | メンテナンス・バックアップ |
| テーブルロック | 低 | 低 | 大量バッチ処理(DDL 等) |
| ページロック | 中 | 中 | - |
| 行ロック(行レベル) | 高 | 高 | OLTP(通常の業務処理) |
テーブルロックと行ロックの両立チェックを効率化するために使われる階層的なロック。下位(行・ページ)にロックをかける前に上位(テーブル)にインテンションロックを取得する。
| 種類 | 意味 |
|---|---|
| IS(インテンション共有) | 下位レベルで S ロックを取得する意向 |
| IX(インテンション排他) | 下位レベルで X ロックを取得する意向 |
| SIX(共有+IX) | テーブル全体に S + 一部行に X の意向 |
| 方式 | ロック取得タイミング | 向いている場面 |
|---|---|---|
| 悲観的ロック(Pessimistic) | アクセス時に SELECT FOR UPDATE でロック取得 | 競合が頻繁・短時間処理 |
| 楽観的ロック(Optimistic) | ロックなし・コミット時にバージョン番号で衝突確認 | 競合が少ない・長時間処理 |
-- 楽観的ロックの例(バージョン番号チェック) UPDATE 商品 SET 在庫 = 在庫 - 1, バージョン = バージョン + 1 WHERE 商品ID = 'P01' AND バージョン = 5; -- 取得時と同じ値なら更新成功 -- 0 行更新なら他者が先に更新 → アプリ側でリトライ
読了ボタンを押すとトップページの進捗に反映されます