アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
あるシステムの処理で

大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成

という処理を行っております。
ファイル作成時に失敗した際に、ロールバック処理を行うように
設定しているのですが、既にデータが挿入されてしまっています。

初心者でいまいち統計情報の取得が良く分かっていないのですが、
統計情報を取得するSQL文を流した時点でトランザクションは
コミットされるのでしょうか?

よろしくお願い致します。

A 回答 (5件)

 10gのマニュアルを確認すると、DBMS_STATSパッケージの解説に次のような一句があります。


 「このパッケージのほとんどのプロシージャは、現行のトランザクションをコミットし、操作を実行してから再度コミットします。 」
 というわけで、統計情報収集のロールバックはできないようですね。
    • good
    • 0

質問からの先読みとなりますが、


統計収集パッケージを実行するとコミットされてしまうようなので不可、
となりますと、動的サンプリングを使うと良いかもしれません。

動的サンプリングとは、SQLを実行する瞬間に表の統計情報を取得するやり方で、SQLのヒント句もしくは、DBの、OPTIMIZER_DYNAMIC_SAMPLINGパラメータで動作を制御できます。

具体的には、

大量データ挿入⇒挿入したデータを基にファイル作成(動的サンプリングヒント句つき)

で対処できるのではないかと思います。

詳しい使用方法は、Oracleパフォーマンスチューニングガイドや、各種Oracle系情報サイトなどで調べてみてください。
<10gドキュメントのリンク>
http://otndnld.oracle.co.jp/document/products/or …
    • good
    • 0

試してみました。



(1)セッション1でempをアップデート
(2)セッション2でempをSelect
※commit前のデータを参照。
(3)セッション1でempをアナライズ
(4)セッション1でempをSelect
※Updateしたデータを参照。
(5)セッション2でempをSelect
※Updateしたデータを参照。
(6)セッション1でRollback
(7)セッション1でempをSelect
※Updateしたデータを参照。
(8)セッション2でempをSelect
※Updateしたデータを参照。

どうやら暗黙Commitがかかっているようです。
DDLを投げると暗黙Commitが流れるのは当たり前のことですが、よく考えてみるとAnalyzeもDDL扱いなので動きとしては納得できます。
    • good
    • 0

トランザクションを開始した時点で、そのトランザクション独自の


世界ができると思ってください。そこで挿入、更新、削除するのは
自由です。INSERT直後にデータを読み込むことも出来ますし、更新も
反映されています。但し、その世界ではの話です。
この時、外の(別の)世界の住人から見ると、DBは全く更新されて
いません。トランザクションをコミットすると、独自の世界の話が
実DBに反映され、外の世界からも同じ情報が見えるようになります。
ロールバックは独自世界の各種更新を無かったことにします。
もし、独自世界の統計では意味が無いというのであれば、コミット後に
統計を取るように手順を変更します。

この回答への補足

何度もご回答ありがとうございます。
質問の主旨が伝わっていないようなので、再度補足させていただきます。
説明不足で申し訳ありません。

大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成

の、ファイル作成(同一トランザクション内)に失敗した場合、ロールバック処理が動くようになっています。
ログを見てみるとロールバックをされているようなのですが、
データが確定されてしまっています。

統計情報の取得をしてしまうと、同一トランザクション内でもロールバックは出来ないのでしょうか?

補足日時:2008/12/02 16:03
    • good
    • 0

同一トランザクションだからでは?


同一トランザクション内のDB更新は反映され、「挿入」したデータが
見えます。しかし、コミットするまでは他のトランザクションや、
プロセスからは「挿入」したデータが見えません。
ファイル作成前にツールなどで、DBを覗いて見ると、「挿入」した
データは存在しないはず。

この回答への補足

同一トランザクションです。
同一トランザクションで、データを挿入して統計情報を取得してしまうと、
ロールバックしてもデータは戻らないという事でよろしいでしょうか?

補足日時:2008/12/02 13:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!