読者です 読者をやめる 読者になる 読者になる

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

ググッた結果をペタリ。

トランザクション分離レベルについて極力分かりやすく解説してみた[SQL] - 明日になったら本気出せる

概要

「パフォーマンスを上げるためにある程度の読み込み不都合を妥協するか、パフォーマンスを落としてもいいから不都合を発生しないようにするか」 という設定のレベルのこと

読み込みの不都合

ダーティリード

別のトランザクションでコミットされてないデータが読み取れる現象。

トランザクションAでレコードを①から②にUPDATE(未コミット)
トランザクションBでレコードをSELECTする
トランザクションAをロールバックする
トランザクションBで取得したデータは②となっている。

一番低いレベルでないと発生しない。
これを許容するシステムをまだ見たことがない・・・

ファジーリード(非再現リード,ノンリピータブルリード)

別のトランザクションで更新後データを読むことにより、一貫性がなくなる現象。

トランザクションAでレコードをSELECTする。①となっている。
トランザクションBでレコードを①から②にUPDATEし、COMMITする。
トランザクションAで同じレコードを再度SELECTする。②となっている。
最初RDBMSを触った時これの何がおかしいの?とか思ってた。そういうもんじゃんとか納得してたんだけどよく考えると隔離性としてはおかしいんだよね。

ファントムリード

別のトランザクションで挿入されたデータが見えることにより、一貫性がなくなる現象。

トランザクションAでレコードをSELECTする。該当レコードがない。
トランザクションBでレコードをINSERTし、COMMITする。
トランザクションAでレコードをSELECTする。2でINSERTとしたレコードが取得できる。
ファジーリードとよく似ているがINSERTとUPDATEという点が違う。

また、以下もファントムリードとなる。

トランザクションAでレコードをCOUNTする。X件取得できた。
トランザクションBでレコードをINSERTし、COMMITする。
トランザクションAでレコードをCOUNTする。X+1件取得できた。

トランザクション分離レベルと読み込みの不都合の関係

ダーティリード ファジーリード ファントムリード
READ UNCOMMITTED 発生する 発生する 発生する
READ COMMITTED 発生しない 発生する 発生する
REPEATABLE READ 発生しない 発生しない 発生する
SERIALIZABLE 発生しない 発生しない 発生しない
  • ダーティリード

    ダーティーリードとは、トランザクション処理において、あるトランザクションが更新されている最中に、他のトランザクションからデータを読み出すことができてしまう現象のことである。

    トランザクション処理においては、本来ならば更新されるデータは更新が完了しなくてはデータを見ることができない。これはトランザクション処理における機能の条件である「ACID特性」のうち「C」の文字で表されている「一貫性」(Consistency)と矛盾する。

    ダーティーリードを禁止することは比較的容易に実現できるが、多くの場合、禁止を実行するとオーバーヘッドを生じさせてしまうことになり、アプリケーションの実行速度を低下させてしまう。同様に、システムの平行性を低下させてしまうことも多い。

    ダーティーリードとは (dirty read): - IT用語辞典バイナリ