Javaプログラマーの技術メモ

勉強したことのメモ帳

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

トランザクションの同時実行制御と分離性

トランザクションの同時実行制御と分離性は、データベースによって異なる。

  • Oracle : 一時領域を使用した「多バージョン法」

    読み取るデータが更新中であっても検索処理が待たされることはない。

  • SQL Server : 「ロック法」

    ロック法による同時実行制御のため、検索時に共有ロックをかける。 読み取るデータが更新中の場合は、すでにそのデータに排他ロックがかかっているため、共有ロックをかけることができない。

    更新中のデータに読み手はアクセスできず、検索処理が待たされる。

Oracle

SQL Server

  • トランザクション分離レベルのうち、Uncommitted Read・Read Committed・Repeatable Read・Serializableをサポートしている。

  • デフォルトはOracleと同じくRead Committedであるが、実際はREAD_COMMITTED_SNAPSHOT データベースオプションの設定によって動作が異なる。

  • READ_COMMITTED_SNAPSHOT データベースオプションがOFFの場合は、更新トランザクション中のSELECTはロック待ちとなる。

  • READ_COMMITTED_SNAPSHOT データベースオプションがONの場合は、通常のRead Committedの動作(多バージョン法)となる。

【参考】

  • Uncommitted Read

    Dirty read・Fuzzy read・Phantom readが発生する。

  • Read Committed

    Fuzzy read・Phantom readが発生する。

  • Repeatable Read

    Phantom readが発生する。

  • Serializable

    トランザクションの同時実行における3つの問題がどれも発生しない。 パフォーマンスを犠牲にして、ロックを行う方式。

【参考】トランザクションの同時実行における3つの問題

参考