• ベストアンサー

ロングトランザクションについて

お世話になります。 長時間トランザクション処理を行おうと思うのですが、 (3000万件のデータを2つのテーブル間でコピーします。  トランザクション処理中、継続して論理ログのバックアップを行います) ロングトランザクション(そのまま?)という用語があり、 長時間のトランザクション処理には問題があると聞きました。 ロングトランザクションの問題について、ご存知の方、教えてください。 よろしくお願い致します。

  • HMID
  • お礼率75% (3/4)
  • Oracle
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

・大容量のUNDO(rollback)セグメントを消費する ・ロールバックするときも、今までの処理時間以上に時間がかかる などの問題があります。 私は通常そういった大量のUNDO領域を生成しないためにも 何件かに1回コミットするように処理します。 #絶対1トランザクションでやらなければならないのであれば仕方ないですけど。

HMID
質問者

お礼

回答していただき、ありがとうございました。 処理を分けるのが面倒なので、なんとか一回のコマンド実行でコピー を行おうと思ったのですが、コピー中に何か異常が起きた時のために 処理を分ける(範囲指定による)ことにしたした。

関連するQ&A

  • トランザクション処理について

    質問させて下さい。 以下の処理を行なっております。 1. トランザクション処理開始 2. テーブルAからデータをDELETE 3. テーブルBへデータをINSERT 4. トランザクション処理終了 上記処理の場合の「TYPE=InnoDB」指定の仕方が不安です。 現在はロールバックの可能性のあるテーブルAのみ「TYPE=InnoDB」を指定しています。 その状態でコミットもうまくいっているのですが、テーブルBに「TYPE=InnoDB」を 指定しなくてもよいものなのでしょうか。 環境 MySql 4.0.24

    • ベストアンサー
    • MySQL
  • トランザクションの考え方

    トランザクションの考え方を教えて下さい。 「データの参照や追加・更新・削除といった処理に矛盾がないことを保証する」という記述を見たのですが、下記の場合も良いのでしょうか。 トランザクションの開始 SELECT * FROM Aテーブル WHERE 項目A = '1' --処理-- UPDATE Aテーブル SET 項目B = '2' WHERE 項目A = '1' トランザクションの終了 開始から終了までの間に他のPCによって SELECT対象のデータが増える可能性があります。 この場合UPDATEするときはやはりSELECTの結果でLOOPするべきなのでしょうか。 上記のようにするとSELECT件数とUPDATE件数は異なってしまうのでしょうか。 環境はVB2005+SQL Server です。

  • postgresqlでのトランザクションについて

    postgresqlで、「WARNING  進行中のトランザクションがありません」のエラーが出てしまいました。 これはそのままの意味だと思うのですが 直す方法がわかりません。 ワーニングなので、、、といいたいところですが、そうもいかず。 apのログで、トランザクション関係の辺りを見ましたところ、 トランザクションを開始し、 TABLEをDROPしようとしましたが、存在しなかった(ようだ)。 (PQexecがエラーでリターン) 存在しないけれど、commit してトランザクションを終わらせている。 のが原因かなと思いました。 なので、PQexec()がエラーの場合はcommitしなければいいのかと はずしましたが結果は同じでした。 トランザクションが無いのだからrollbackもいらないですよね。 そこで質問ですが drop文、1ステップのSQL実行も明示的にトランザクションの処理をしたほうがいいのでしょうか? このワーニングは通常のトランザクションの処理の中で、どういう時にでるのでしょうか? oracleとpostgresqlの明示的・暗黙的な制御に戸惑っています。 (oracleからpostgresqlに移行することになりました) 叱咤でも何でもかまいませんので、アドバイスよろしくお願いいたします。

  • トランザクション中にSELECTした場合について

    InnoDBを使っているのですが、 以下の1.から5.の処理の間に、サーバー1.の「テーブルA」へ SELECTを掛けた場合、何か遅い気がします・・原因は何でしょうか? 1.サーバー1でトランザクション開始 2.サーバー1の「テーブルA」をDELETEでを全削除 3.サーバー2から「テーブルA」の新しいデータを取得 4.3.で取得したデータをサーバー1の「テーブルA」へINSERT 5.サーバー1でトランザクション終了 他のトランザクションでDELETEされたレコードに対し、 SELECTすると結果が返るのは遅いでしょうか?

    • ベストアンサー
    • MySQL
  • トランザクション中に別のトランザクションは開始できますか?

    DBはサイベースを使っています。初心者です。 以下のような動作をしているシステムの一部を改造することになりました。 1)カーソルAオープン 2)トランザクション開始 3)フェッチ 4)1トランザクションでの処理数分終了済みでなければ、3)から繰り返し 5)commit/rollback 6)終了済みでなければ 2)から繰り返し 7)カーソルAクローズ 今回、3)でフェッチしたレコードのある項目をキーとして 別のテーブルを検索しなければならないのですが、 3)の後に、カーソルBオープンとフェッチのみを追加しただけでは問題があると思うのですが、同一プロセスから、トランザクション中に別のトランザクションを開始することは可能なのでしょうか? なお、このトランザクションでは、レコードの追加や削除は行いません。 どうぞよろしくお願いいたします。

  • トランザクションの考え方の疑問点

     トランザクションについてネットでいろいろ調べたのですが、 ピンと来ていないので下記の意味合いで合っているのか、 教えて頂けないでしょうか? ・トランザクションは、データベースに対してかかる (テーブル単位にかかるわけではない) ・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を 走らせた時、そのテーブルがロックされる ・コミットが終わるまではロックはかかったまま ・失敗すればロールバックでデータを元に戻せる  …こんな風に考えていますが、 ここまでは合っているでしょうか? また、下記からが疑問なんですが… ・ロックの種類は、SQLの書き方で決められるみたいですが、 特に指定しなかったらテーブルロックになるものなのでしょうか? ・SELECT中は、ロックがかかるものなのでしょうか?

  • MySQLのトランザクションについて

    WEBアプリ上の、MySQLのトランザクションについて質問です。 トランザクションは、データの挿入に矛盾がない場合commitすることによって データの挿入等を確定する機構だとおもいますが、 この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライアント以外 アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか? そうじゃないと、意味がないですよね?やっぱり。。。 また仮にですが、例えばAというクライアントがWEBサイトにアクセス中に Bというクライアントが待ったく 同じ動作を同じタイミングでアクセスした場合ってどうなるのでしょうか? 実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか? また、ちなみにMySQLの場合、 "START TRANSACTION" というSQL文だけでなく AUTOCOMMIT = 0 として、自動コミットをオフにしつつ beginという式で トランザクションを開始する方法があるようですが、実際はどちらの方が当たり前のほうほうなのでしょうか? 識者の方ご教授ください。

    • ベストアンサー
    • MySQL
  • C#でトランザクション開始後参照出来ない

    言語:C# DB:SQLServer2008 1.トランザクション開始 2.テーブルAをUPDATE 3.色々な処理(省略) 4.テーブルAのUPDATE前の情報を参照 5.参照したテーブルをもとにテーブルBをUPDATE 6.すべての処理が正常だったら全テーブルコミット、1つでも失敗したら全テーブルロールバック 問題となっているのは 4.テーブルAのUPDATE前の情報を参照する際に、テーブルAがロックされていて参照出来ないことです。 トランザクション開始時に分離レベルを設定してみましたが同じ結果でした。 tran = con.BeginTransaction(分離レベル); お分かりになる方ご教授お願いします。

  • 複数テーブルへのデータ更新

    sql server 2012環境です。 c sharpを利用してDB登録処理を書いています。 10万件のデータを3つのテーブルにそれぞれ入れたいのですが、一度に 10万件でなく、1万件ずつコミットさせたいと思っています。 データの元となるテーブルは1つで、それに10万件のデータが あるイメージです。 イメージとしては トランザクション開始 テーブル1へ1万件登録 テーブル2へ1万件登録 テーブル3へ1万件登録 コミット というようなことを10回ループしたいのですが、可能でしょうか。 1つのトランザクション内で3テーブルへ更新をかけるやり方がよくわかりません。 あとは大元のテーブルをrow_numberを使って1万件ずつselectすればどうだろうかと 思っています。

  • 「トランザクション処理」について質問

    Oracle Database 11g の 「トランザクション処理」について質問。 認識:UPDATE文が発行されるとキャッシュに更新前の情報(UNDOセグメント)が生成される。 REDOログバッファにREDOログを生成する。 UPDATE文が正しく行われたことを、プロンプトに返す。 この時、REDOログファイルにはまだ書き込まれていない。 データファイルにも書き込まれていない。 質問:このコミットされていない状態で、障害が起きた(メモリが飛んだ)場合、 コミット前の状態にしか戻れないですか? データベースの概要のACID特性の一貫性は、 トランザクションの一貫性ということですか? また、UPDATA文を発行し、プロンプトが返ってくるが、 これは嘘になりえるっていうことでしょうか? よろしくおねがいします。