エンタープライズ:特集 | 2003/08/24 11:32:00 更新 |
[JAVA Developer特別企画]2003年10月号
知っておきたいデータベース移行術「Oracle→DB2編」 (7/7)
JAVA Developer 2003年10月号より転載
Oracleはデータ更新時にREDOログだけでなく、UNDOセグメント(あるいはロールバックセグメント)にも変更前イメージを記録します。記録されたBEFOREイメージはロールバック時に使用されますが、それとともに読み取り一貫性の実現にも使用されています。アプリケーションがSELECT文を発行したとき、読み取り対象データが未コミットのデータであれば、このUNDOセグメントから変更前情報が取り出され、それがSELECT文の結果として返ります。 この読み取り一貫性の機能により、OracleはアプリケーションがSELECT文を発行した時点でのコミット済みデータを読み取ることを保障しています。また未コミットデータがあっても、アプリケーションは読み取り時にブロックされず、並行性は良好です。ただし、この読み取り一貫性には、バッファキャッシュに余分なデータを入れたり、REDOログのほかにUNDOセグメント用の領域が必要です。 DB2の場合は、UNDOセグメントに対応するものがなく、変更前情報はログにしか記録されません。当然ロールバックはログを基に行われます。そしてアプリケーションがSELECT文を発行したとき、読み取り対象データが未コミットのデータであれば、SELECT文は待機されます。 DB2ではSELECT文の実行時、行をフェッチする瞬間に行に対して共有ロックをかけます。また、未コミットの変更データには、排他ロックがかかるようになっています。排他ロックと共有ロックは互換性がなく、アプリケーションは共有ロックを取得できないため、SELECT文が待機状態になるというわけです。ちなみに、Microsoft SQL Serverのロック制御方式は、DB2が採用しているロック制御方式とほぼ同じです。 DB2でアプリケーションを組む場合には、ロックの保持期間をできるだけ短くするようにしてください。コミットする間隔を小さくし、並行性をできるだけ大きくすることで、アプリケーションがより健全に動作できるようになります。
最後にDB2 V8より登場したUniversal JDBCドライバについて簡単に説明しておきます。DB2の従来JDBCドライバは、タイプ2と3しかサポートしていませんでしたが、DB2 V8になりタイプ4もサポートされるようになりました。このタイプ4ドライバと新しいタイプ2ドライバの2つを含んでいる新しいJDBCドライバを「Universal JDBCドライバ」と呼びます(ライブラリは「db2jcc.jar」)。 使用方法などに関しては、IBM USサイトで詳しく解説しております。ぜひ、一度お試しください。
関連リンク
|
[竹内 笑子,JAVA Developer]