とうせきとうちゃんのお料理日記

とうせきとうちゃんのお料理日記

 
人工透析3年生だが、8月に退職して今は無職。

今は家族との時間を中心に人生を歩み直し中。

毎日会社に行く必要がなくて、嫁ちゃんと一緒にキッチンに立つ日々が楽しくて仕方ない。

 

 

とうちゃん

分離レベルの概要
Read Uncommitted
Read Committed
Repeatable Read
Serializable

許可される現象の詳細
Dirty Read
Non-Repeatable Read
Phantom Read

 

 

じぇみ君

「分離レベル」とは、一言で言えば「複数人で一つのファイルを編集する時の『ルールの厳しさ』」のことです。

 

 

1. 何を守る戦いなのか?(トレードオフ)
 この概念は、以下の2つのどちらを優先するかという「シーソーゲーム」です。

 ・正確さ(データの整合性): データが矛盾しないことを最優先する。その代わり、誰かが使っている間は他の人は待たされる(遅くなる)。

 ・速さ(パフォーマンス): 待たされるのは嫌だから、多少の矛盾は許してガンガン処理する。

 

 

2. まず「3つのバグ(許容される現象)」を理解しよう

レベルの話をする前に、何が起きるとマズいのか、「共有フォルダのExcelファイル」をイメージしてください。

① ダーティリード(Dirty Read): 「書きかけのチラ見」
・Aさんがセルに「100」と入力中(まだ保存ボタンを押してない)。
・Bさんがそれを覗き見て「あ、100だね」と認識する。
・直後にAさんが「やっぱナシ!」と入力をキャンセルする。
・結果、 Bさんは「幻の100」を信じて処理を進めてしまい、計算が狂う。

② ノンリピータブルリード(Non-Repeatable Read): 「さっきの値段と違う!」
・Aさんが商品マスタを見て「100円だな」と確認。
・その直後に、Bさんが「200円」に書き換えて保存した。
・Aさんがもう一度見たら「あれ? 200円になってる!」
・結果、 同じ処理中に値が変わってしまい、Aさんが混乱する。(※行の内容が変わる現象)

③ ファントムリード(Phantom Read): 「お化けが出た!」
・Aさんが「会員リスト」を検索して「現在5人」と確認。
・その裏で、Bさんが「新規会員」を1人追加して保存した。
・Aさんがもう一度検索したら「あれ? 6人いる!」
・結果、 データの値ではなく、「行数(数)」が増減してしまう。(※データが増えたり消えたりする現象)



3. 4つのレベル(厳しさの段階)

上記のバグをどこまで許すかで、レベルが決まります。

Lv.1:Read Uncommitted(無法地帯)
別名: 書きかけでもなんでも読んじゃえモード」
状態:保存前のデータも読める。めちゃくちゃ速いが、計算間違いのリスク大。
例え:あなたが原稿を書いている横から、私がリアルタイムで誤字脱字も含めて読み上げる状態。「あ、そこ消すの!?」と混乱します。

Lv.2:Read Committed(標準的・実用的)
別名:「保存されたものだけ読むモード」
状態:多くのDB(Oracle, PostgreSQLなど)のデフォルト。
特徴:「書きかけ」は読まない。でも、読んでる最中に誰かが更新したら、新しい値が見えちゃうこともある。
例え:あなたが「保存(Ctrl+S)」を押した瞬間だけ、私が内容を確認できる状態。一番バランスが良いです。

Lv.3:Repeatable Read(自分だけの世界)
別名:「スナップショットモード」
状態:MySQLのデフォルト。
特徴:トランザクションを開始した瞬間に「その時点の魚拓」を取るイメージ。他の誰かがデータを更新しても、自分には「開始時点の古いデータ」が見え続ける。
例え:あなたが原稿を印刷して私に渡してくれた状態。あなたがその後パソコンで修正しても、私の手元の紙(印刷物)の内容は変わりません。

Lv.4:Serializable(完全直列・激重)
別名:「一列に並んでお待ちくださいモード」
状態:完璧な整合性。でも、誰かが触っている間はロックがかかり、誰も触れない。
例え:「編集権限」を持っている人しか部屋に入れない状態。あなたが部屋から出るまで、私はドアの前で正座して待機します。



じぇみ先生のまとめ
 もしWebアプリを作るなら、基本的にはデフォルト(Read Committed か Repeatable Read)のままで大丈夫です。
 銀行の残高計算のように「絶対に1円もズレてはいけない」なら Serializable。
 SNSの「いいね」数のように「多少ズレても速いほうがいい」なら Read Committed 以下となります。