Oracle で新しいトランザクションを開始するためにセーブポイントを代用できますか?

StackOverflow https://stackoverflow.com/questions/1514526

質問

現在、レコードのセットを挿入するために使用しているプロセスは次のようなものです。

(そして、「レコードのセット」とは、住所、電話番号、またはその他の結合されたテーブルを伴う個人のレコードのようなものを意味することに注意してください)。

  1. トランザクションを開始します。
  2. 関連するレコードのセットを挿入します。
  3. すべてが成功した場合はコミットし、そうでない場合はロールバックします。
  4. 次のレコードのセットについては、ステップ 1 に戻ります。

もっとこのようなことをすべきでしょうか?

  1. スクリプトの先頭でトランザクションを開始する
  2. レコードのセットごとにセーブポイントを開始します。
  3. 関連レコードのセットを挿入します。
  4. エラーが発生した場合はセーブポイントにロールバックし、すべてが成功した場合は続行します。
  5. スクリプトの先頭でトランザクションをコミットします。

ORA-01555 に関する問題が発生し、Ask Tom の記事をいくつか読んだ後 ( これです)、2番目のプロセスを試してみようと考えています。もちろん、トムが指摘するように、新しいトランザクションの開始はビジネス ニーズによって定義されるべきものです。2 番目のプロセスは試してみる価値がありますか、それとも悪い考えでしょうか?

役に立ちましたか?

解決

トランザクションは、仕事の意味のある単位でなければなりません。しかし、どのような作業単位を構成するものは、コンテキストに依存します。 OLTPシステムで作業単位等、自分のアドレス情報と一緒に、一人だろう。しかし、あなたは人の多くをロードしているバッチ処理のいくつかのフォームを実装しているかのように聞こえる。

あなたはORA-1555との問題を抱えている場合は、他のトランザクションによって更新されているデータを供給実行時間の長いクエリを持っているので、

それはほぼ確実です。あなたのループ内でコミットすると、UNDOセグメントの循環的な利用に寄与し、あなたが読み取り一貫性を提供することに依存しているセグメントが再利用されている可能性を増加させる傾向があります。だから、それをやっていないことは、おそらく良いアイデアです。

セーブポイントを使用することが解決策であるかどうかは別の問題です。私はあなたの状況であなたを与えるだろうと何利点はよく分かりません。あなたがでOracle10gで作業しているとして、おそらくあなたは、バルク<のhref =「http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#ADMIN10261」のrel =」を使用することを検討すべきです"nofollowをnoreferrer> DMLエラー・ロギングが代わりに。

別の方法としては、それがデータの小さな塊で動作するように駆動問合せをリライトしたいかもしれません。あなたのプロセスの詳細についての詳細を知らなくても、私は具体的なアドバイスを与えることはできません。しかし、一般的には、代わりに10000のレコードの1つのカーソルを開くのは500行ポップのためにそれを20回開くために良いかもしれません。考慮すべき他の事は、バルク収集とFORALLを使用することによって言う、挿入プロセスをより効率的に行うことができるかどうかです。

他のヒント

いくつかの考え...

  1. asktom リンクのポイントの 1 つは、1555 を避けるためにロールバック/アンドゥのサイズを適切に設定することだったようです。これが不可能な理由があるのでしょうか?彼が指摘しているように、ロールバック制限を回避するコードを書いたり保守したりするよりも、ディスクを購入する方がはるかに安いです (ただし、36Gb ドライブの 250 ドルの値札を読んで二度見する必要がありましたが、このスレッドは 2002 年に始まりました) !ムーアの法則をよく表しています!)
  2. このリンク (バーレソン) は、セーブポイントに関して考えられる問題の 1 つを示しています。
  3. 実際のトランザクションは 2 番目のシナリオのステップ 2、3、および 5 ですか?もしそうなら、私ならそうするでしょう - 各トランザクションをコミットします。シナリオ 1 はトランザクションのコレクションを 1 つにまとめたもののように思えますが?
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top