JTAを使用したテーブルデータの更新について

このQ&Aのポイント
  • JTAを使用して、複数のテーブルデータを一括で更新したい場合に困っています。該当データの検索と更新をループさせ、最後に一括でコミットしたいのですが、現在の設定ではうまくいきません。
  • コネクションのautoCommitをfalseに設定しているにも関わらず、更新されたデータがすぐに反映されず、次の該当データを検索するタイミングでコミットされてしまいます。
  • この問題を解決するにはどうすれば良いでしょうか?お知恵をいただけると幸いです。
回答を見る
  • ベストアンサー

JTAでこういうことがしたいんです。。。

こんにちは。よろしくお願いします。 webworkとシーサーとhibernateを使ってるのですが、 テーブルデータの更新で悩んでいます。 やりたいことは・・・ 1.セッションを取得 2.トランザクション開始 <ここから該当データ分ループ> 3.該当データの検索 4.該当データの更新 <ここまでループ> 5.コミット(トランザクション終了) 要するに、該当データ分「全て」の更新がうまくいかない場合はrollbackし、うまくいけば一括でcommitしたいのです。 それで今、コネクションのautoCommitをfalseにしているのですが、上手くいきません。 確かに更新(session.update)時にすぐに更新されるわけではないのですが、次の該当データを検索する(session.find)ところでコミットされてしまいます。 どうしたら解決できるのでしょうか。。 お知恵を貸してください。 よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

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

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

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20765&forum=12 ↑が参考になりそうな予感。 って同一人物だったりして。(笑)

参考URL:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20765&forum=12
ballady
質問者

お礼

お礼が遅くなって申し訳ありません。 仰るとおり、同一人物でした(笑) すっかり皆さんにお世話になってしまい、本当に恐縮です。 あと、皆さんが優しく教えてくださって驚いています。 どうもありがとうございました!

関連するQ&A

  • mySQLでロールバックされずコミットされる

    お世話になっております。 現在JavaのjdbcでmySQLに接続してデータを更新する処理を入れているのですが AutoCommitをfalseにしておりrollbak処理をしているにも関わらず commitがされている状態になっています。 ログ出力にてメソッド内でsetAutoCommitがfalse、 rollbakが実行されていて、commitが実行されいないのは確認済みですが 実際にはデータがロールバックされずcommitされたのちに コネクションが閉じられています。 このような勝手なコミットがされてしまう原因で 他に何か思い当たる確認点はないでしょうか? ご力添えお願いします。

    • ベストアンサー
    • Java
  • AccessShareLock はどの程度気にする必要がある?

    PostgreSQL8.2とJavaを使ったWebアプリケーションを構築しています。 pgAdminでサーバー状態>ロック で参照してみたところ、AccessShareLockというのが大量に発生していました。 マニュアルを参照してみたところ、 >AccessShareLock を除き,トランザクション内で獲得されたすべての ロックモードは,そのトランザクション実行の間維持されます. とあり、つまりAccessShareLockはトランザクションの間でも維持されないということだと思うのですが、どうも解放されてはいないようです。 これは通常の(つまり、更新しない)select文を発行したときに発生するロックだと思うのですが、いろいろ調べても、どうもこのAccessShareLockというのをどのくらい気にしたらいいのかがわかりません。 このロックが残っていると、どのようなときに困るでしょうか。 また、解放するためには通常のselectのあとでもcommit(またはrollback)をする必要があるということになるでしょうか。その際にはcommitとrollback、どちらがいいということはあるでしょうか。 ご存じのかたがいらっしゃいましたらご教示いただければと思います。よろしくお願いいたします。

  • ActivePerl+SQLServerでトランザクション制御をしたいのですが。。。

    ActivePerl(5.6.1)で、SQLServer2000に接続してデータ更新を行う際に、トランザクションを制御して、コミット/ロールバックを使いたいと思っています。 データベースへの接続はODBCです。 まずは auto commit の設定をオフにしよう・・・と思ってやってみたのですが、これが成功しません。 何かよい方法はないでしょうか?よろしくお願いします。 【環境】WinNT,IIS

    • ベストアンサー
    • Perl
  • MySQLのトランザクションについて

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

    • ベストアンサー
    • MySQL
  • ActiveX DLLでのオラクルのトランザクション

    VB6とOracle9iのOO4Oにてシステムを構築しておりますが、一つ解らないことがありましたので、どなたかご教授願います。 あるPG(通常のEXEです)よりActiveX DLLを呼び出してOracleの表へデータを挿入する処理があります。呼び出し元となる通常のEXEはまずOracleの接続処理を記述しています。正常に接続が完了したならトランザクションを開始し、表のDeleteを実行します。その後ActiveX DLLを呼び出して表のInsertを実行しています。再び通常のEXEに制御が戻り、トランザクションの完了(COMMIT)または破棄(ROLLBACK)を行います。しかし、最後のトランザクションのCOMMIT(ROLLBACK)を行うと『コッミト(ロールバック)時にアクティブなトランザクションがありません』というエラーが発生してしまいます。正しくBegin Transactionを実行しているのに、これはどういうこと何のでしょうか。ご存知の方がいらっしゃましたら教えてください。

  • トランザクション中に別のトランザクションは開始できますか?

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

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

    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すればどうだろうかと 思っています。

  • トランザクションを張って対話型でのコミット・ロール

    トランザクションを張って更新処理を行った後に、 ユーザの「はい」「いいえ」ボタンによって、 トランザクションのコミットとロールバックを切り替えることは可能でしょうか。 処理の流れは以下の様になります。 1.データ更新前の値を取得 2.トランザクションの開始 3.データ更新 4.データ更新前の値とデータ更新後の値を比較して、   差分がある場合は確認メッセージを表示する。 5.確認メッセージで「はい」がクリックされた場合はコミットする。 6.確認メッセージで「いいえ」がクリックされた場合はロールバックする。 実装方法はどのようでも構いません。 どなたかご教授ください。

  • select実行時のロックとcommitについて

    お世話になっております。 WEB上で検索すると、select実行時にもロックを取得しcommitもしくはrollbackを実施していることがわかりました。 そのことについて数点疑問を持ち調査したのですが、わかりませんでした。 どなたかわかる方ご教示ください。 (1) select発行時にロックを取得しcommitもしくはrollbackするという認識は正しいでしょうか。 (2) 通常SQLに不備が無ければselectは正常に終了すると思いますが、 rollbackするのはどのような状況でしょうか。 selectのSQLに不備があった場合でしょうか。 (3) コンソールからselectを発行するとcommitせずとも結果が出力されます。 このcommitされるタイミングはいつになるのでしょうか。 (4) WITH URオプションを使用するとロックを取得しないと思いますが、 ロックを取得しないということはcommit/rollbackも実施されないという認識は正しいでしょうか。 (5) commitコマンドを発行するとアクティブログに追記されるという認識なのですが、 WITH URオプションなしでselect文を発行してもアクティブログに追記されるものでしょうか。 それともテーブルの更新など実施しないので、アクティブログは更新されないのでしょうか。 (6) WITH URオプションをつけてSELECTを実施した場合はアクティブログは更新されないでしょうか。 (7) EXPORTコマンドを実行した場合も(5)(6)と同様という認識で正しいでしょうか。 以上になります。 よろしくお願いいたします。

  • insert1つの処理でもトランザクションは必要?

    お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう