1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【DBスペシャリスト試験】トランザクションの分離レベル

1
Last updated at Posted at 2023-07-10

イメージ掴みたい方用

トランザクションの分離レベルとは

  • トランザクションに指定できる直列化の度合い。
  • 直列化とは、並列化の反対で、トランザクションを順番に実行するようにすること。
  • 直列化の度合いとは、複数トランザクションを実行したときの結果が、どれだけ「順番に実行した結果」に近くなるか、ということ。
    • 最高は順番に実行したとき。
      • 分離レベル高:整合性↗、処理効率↘(順次実行に近いと整合性は担保できるが遅い)
    • 最低はまだコミット前のデータでも読んでしまう(別トランザクションの結果を確定前でも先読みしてしまう)ようなとき。
      • 分離レベル低:処理性能↗、整合性↘(並列化すると処理速度は上がるが複数の処理が混じってデータが整合しないことあり)
  • SQLで"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" みたいにして使う(MySQLの例)

各分離レベル

低い順。
異常形態の名前の解釈は個人のものです。あくまでイメージを掴むため...
(ただし、固有名詞は参考書やドキュメントに記載のあるもの)

READ UNCOMITTED

他のトランザクションが更新した、コミット前のデータも読む。
実際にはコミットされずロールバックされた場合には、コミット前のデータはダーティデータとなり、上記読み取りはダーティリードと呼ぶ。

READ COMITTED

他のトランザクションでコミット済みのデータを読む(コミット待ちの変更は読まない)。
ただし、コミットさえされれば読むため、
トランザクション中で同じデータを2回以上読んでいる場合は、1回目と2回目とで読み取り結果が異なる、があり得る。
これは、再度読んでも同じ結果が返らない(繰り返しが効かない)、という意味でノンリピータブルリードと呼ぶ。

REPEATBLE READ

トランザクション内であれば、同じデータを何度読みだしても、(他のトランザクションがそのデータを更新してコミットしようが)必ず同じ結果を返す。
ただし、対象データの更新や削除を無視するだけで、処理途中に新規追加された行がぽんと現れることはある。
これは、1回目などには存在しなかった行が現れるという意味で、ファントムリードと呼ぶ。

SERIARIZABLE

順番に実行する。
並列実行しても制御されて直列実行される。

分離レベルと各異常形態の関係

ある分離レベルで起こりうる異常は、それ以下の分離レベルでも起こりうる。

分離レベル\異常形態 ダーティリード ノンリピータブルリード ファントムリード
READ UNCOMITTED 許す 許す 許す
READ COMITTED 許さない 許す 許す
REPEATABLE READ 許さない 許さない 許す
SERIALIZABLE 許さない 許さない 許さない

参考

ひとこと

多くのDB製品はデフォルトはREAD COMITTEDらしい。実際は排他制御とかも使っていい感じにやってるらしい。
間違いやこの方が覚えやすいよ等あればコメントやご指摘いただけますと嬉しいです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?