ablog

不器用で落着きのない技術者のメモ

Oracle はどのようにして読み取り一貫性をとっているか

Oracle はどのようにして読み取り一貫性をとっているかまとめてみた。

  • 例えば、SCNが100の時点でselect文を発行したとする。
  • 必要なデータブロックを読み出す。
  • ブロックヘッダのSCN <= 100 なら読み出したデータブロックを使う。
  • そうでない場合、ブロックヘッダのITL*1を見てどのUNDOブロックを使えば良いか判断する。
  • ITLはリストなので、リスト中のどのトランザクションエントリを使うか判断する。(Flag、Scn/Fcn という項目を使うらしい)
  • トランザクションエントリのロールバックセグメント番号、スロット番号、順序番号をもとにロールバックセグメントヘッダのTRN TBL*2内のエントリを特定する。(TRN TBL もリストなので、エントリを特定する必要がある)
  • 特定したエントリのSCN <= 100 ならUNDOブロックを読み出して使う。
  • 使えるUNDOブロックがない場合、ORA-1555が発生する。


いいお絵かきツールないかな。絵のほうがわかりやすいんだけどな。言葉だとわかりにくいな。

[参考]
おら!オラ!オラクル
OracleとDB2、アーキテクチャはこれだけ違う (2/2):RDBMSアーキテクチャの深層(2) - @IT


追記:
噂には聞いていたが、Microsoft SQL Server も 2005 以降はマルチバージョン制御による読み取り一貫性を実現しているらしい。「READ COMMITTED SNAPSHOT」と「スナップショット分離レベル」が用意されていて、Oracle の「Read Committed」、「Serializable トランザクション」に、tempdb が Oracleロールバックセグメントに相当するらしい。

SQL Server 2008 のセミナーを受けてきました - akitohの日記
http://www.microsoft.com/japan/sqlserver/2005/ssj/tips/02.mspx

*1:INTERESTED TRANSACTION LIST

*2:TRANSACTION TABLE