株式会社SALTO

第2回教えて

更新日:2018.09.10
Pocket

こんにちは

ツボです!

では早速進めていきましょう
 
第2回

『細かいことはいいから実装教えて』シリーズ

ということで副題
  
~分離レベルとは~
 
を紹介していきます
 
『分離レベル とは』でグーグル先生に聞いてみると…
 
トランザクション分離レベル (-ぶんり-)または 分離レベル (英: Isolation) とは
データベース管理システム上での一括処理(トランザクション)が複数同時に行われた場合に
どれほどの一貫性、正確性で実行するかを4段階で定義したものである。
隔離レベル 、 独立性レベルとも呼ばれる
 
参考:Wikipedia
 
 
と検索結果に出ますが…わかります?
 

ツボが一番わかっていない件

 
 
ということで簡単に言うと
「こういう時こうしたい」を設定することです!
 
 
で、その設定が4つあるわけです
それがこれです↓
 

SERIALIZABLE
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED

 
それぞれ意味があるんですがその前に3つほど紹介します
 
 

Dirty Read(読:ダーティリード)

⇒2人が一緒に同じDBのテーブルを処理していると仮定して
一人目がDBにトランザクションでデータを追加します
二人目が追加されたデータを読み込みます
一人目がロールバックを実行します
二人目は存在しないデータを読んだことになりました
さあどうしましょう?
 
  

Non-Repeatable Read(読:ノンリピータブルリード)

⇒2人が一緒に同じDBのテーブルを処理していると仮定して
一人目がDBでトランザクションをかけてデータを読みます
二人目が同じデータを変更・削除してコミットします
一人目が同じデータをトランザクション内で削除されたデータを読みます
さあどうなるでしょう?
※ちなみにファジーリードという呼び方もあります
 
 

Phantom Read(読:ファントムリード)

⇒2人が一緒に同じDBのテーブルを処理していると仮定して
一人目が頑張って作ったSQL(テーブル結合とか副問合せとか)であるデータの集まりを取得する
二人目が一人目の作ったSQLで抽出できるデータを入れる
一人目が作ったSQLを実行すると最初と異なるデータが抽出される
※トランザクション内でデータ不整合が起きた!
さあどうしましょう?
 
 
 
 
むずかしかったですかね?
説明下手ですみません
 
 
で、分離レベルの設定は4つあるという話から3つのリードについて説明しました
4つの分離レベルの設定とは、どのリードを許容してどのリードを付加とするかを選ぶことにあります
 
「そんなの全部許可しないよ」という方
いやいやおまちください
 
あんまり締め出し過ぎるとかえってバグになることがあります
上手く用途に応じた分離レベルの設定というのが重要になります
 
 
さて、長くなったので最後に各分離レベルが何を許可して何を拒否しているのか
説明して今回は閉めたいと思います
 
・SERIALIZABLE
Dirty Read ⇒起きない
Non-Repeatable Read ⇒起きない
Phantom Read ⇒起きない
 
・REPEATABLE READ
Dirty Read ⇒起きない
Non-Repeatable Read ⇒起きない
Phantom Read ⇒起きる
 
・READ COMMITTED
Dirty Read ⇒起きない
Non-Repeatable Read ⇒起きる
Phantom Read ⇒起きる
 
・READ UNCOMMITTED
Dirty Read ⇒起きる
Non-Repeatable Read ⇒起きる
Phantom Read ⇒起きる
 
 
 
いかがでしたでしょうか?
DBのトランザクション一つとっても結構奥が深いですよね?
 
さて次回は行ロック、表ロックについて説明したいと思います
暇な人は見ていってください
 
 
それではまた、サラダバー