- ベストアンサー
DB2でSelectした時(rollback,commitの必要性)
Oracleでの開発が長く、DB2は初めてなので戸惑ってます。 OracleでSelect文を発行する時はトランザクション処理が発生しているわけではないので、rollbackやcommitはしないのですが、DB2を使った今回のシステムではselectをした後でrollbackやcommitを使用するように設計書記述がされています。 必要ないような気がするのですが、DB2ではSelectでも必須なのでしょうか? ご回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そもそも、SELECT文であってもトランザクションは発生しています。DB2に限らず、ORACLEでもSQL Serverでも、DBMSならば皆そうです。もし明示的に行っていなかったとしても、暗黙的には最終的にCOMMIT/ROLLBACKがされているはずです。 ORACLEの場合、コミット前の修正中のレコードに関しては、UNDOセグメントの内容を見せるのに対して、DB2やSQLServerではロック待ちになりますね。このあたりはDBMSの考え方の違いによるものであり、面白いところです。 細かい話になりますが、トランザクションの「分離レベル」の設定により、SELECT時の取られるロックが変わってきます。 ロックに関しては、 http://www-6.ibm.com/jp/software/data/db2univ/lab/ise/techlib/v71design_05.html を読んでみてください。一番わかりやすい日本語のドキュメントじゃないかしら。。
その他の回答 (1)
- yukion
- ベストアンサー率42% (3/7)
それはLockを解放するいう意味で必要です。SELECTであっても他のアプリケーションからの更新等を防ぐためにLockは取得されているのでトランザクション(作業単位-UR)の終了を明示的に知らせるためにCOMMITを発行します。 明示的にCOMMITを出さないとアプリケーションの終了のように暗黙的なCommitになるまでLockは保持され、他のアプリケーションが待たされる可能性があります。 どのようなタイプのLockが取得されるか・Lockされる期間は設定により変わりますので、ちょっと勉強が必要ですが、考え方はORACLEと共通だと思います。
お礼
質問をした後で偶然見つけたサイトにて、selectを実行した後で明示的にCommit,rollbackを行わないのはOracle位と言う事が判りました。 「普通、RDBMSではREAD COMMITEDをおこなうためにSELECTでSHARED LOCKを発行する方が主流」 とのこと。ひとつ勉強になりました。 ご回答ありがとうございました。
お礼
判り易いサイトのご紹介ありがとうございます。 114ページは読むのにちょっと時間かかりましたが、確かに判り易いです。 DB2の開発が初めてだったので、色々Oracleとの違いが判って面白いですね。 ご回答ありがとうございました。