- PR -

テーブル更新処理を全件終えた後にコミットしたい

投稿者投稿内容
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-04-24 00:11
そういや、S2Daoを使う時のdiconファイルの記述ですが、
S2DaoのInterceptorとTraceInterceptorと
JTAのInterceptorの記述順によってトランザクションログが
出たり出なかったりという現象が発生しました。

その時は、S2DaoのInterceptorを後に記述して、
先にJTAのInterceptorを記述するようして
トランザクションログが出力されました。

参考になればいいですが、S2Daoなので何ともいえませんね。。。

参考までに。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2005-04-24 02:34
私の環境では、普通にログはでていますね・・・

DEBUG 2005-04-24 02:10:25,528 [main] トランザクションを開始しました
<中略>
DEBUG 2005-04-24 02:10:25,998 [main] 物理的なコネクションを取得しました
DEBUG 2005-04-24 02:10:26,008 [main] 論理的なコネクションを取得しました
<中略>
WARN 2005-04-24 02:10:26,028 [main] SQL Error: 1062, SQLState: 23000
ERROR 2005-04-24 02:10:26,028 [main] Duplicate key or integrity constraint violation message from server: "Duplicate entry '1' for key 1"
<中略>
DEBUG 2005-04-24 02:10:26,038 [main] トランザクションをロールバックしました

とこんな具合です。ここでは主キーを重複させてエラーを発生させ、ロールバックがなされています。

普通にコミットされてしまうということは、逆に処理がうまく行ってたりはしないでしょうか・・・?デバッガなどで追うとどうでしょう?
たまこ
常連さん
会議室デビュー日: 2005/01/12
投稿数: 25
投稿日時: 2005-04-24 15:02
> かつのりさま
アドバイスありがとうございます。
Interceptorの書き方、見てみました。
私の場合、Interceptorは2種類書いてありました。

1つはS2hibernateDAOで、s2hibernate.diconに
 <component name="interceptor"
  class="org.seasar.hibernate.dao.interceptors.S2HibernateDaoInterceptor"/>
もう1つはTraceInterceptorで、s2xwork.xmlに
 <component name="traceInterceptor"
  class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>

かつのりさんの書いてくださったものと比較してみると、JTAのInterceptorというものがそもそも私のほうには存在しないのです・・・。
JTAのInterceptorとは何でしょうか?
恐れ入りますが、ご教授頂けますと嬉しいです。。
よろしくお願いします。
たまこ
常連さん
会議室デビュー日: 2005/01/12
投稿数: 25
投稿日時: 2005-04-24 15:18
> Odakazさま
ありがとうございます。
eclipseのデバッガで追うと、
私の場合は、途中であるはずのデータが存在しなく、SQLExceptionなどではなく、自分で落としています。

■HogeDAOの以下の部分でelseに入り、Exceptionを投げます。

// 該当データが存在するか検索
 List result = session.find("from UserTbl as u where u.userId = ?",warr[j][i],Hibernate.STRING);
 if (result.size() > 0) {
  usertbl = (UserTbl) result.get(0);
 } else {
  throw new Exception("エラーメッセージ");
 }

■ExceptionをHogeActionでcatchし、return INPUTでエラー画面を出力させます。

 try {
  // 更新処理
  ret = hogedao.updUser(warr,lineCnt);
 } catch (〜〜Exception 〜〜e){
  log.error(〜〜e.getCause());
  log.info("異常終了");
  return INPUT;
 }

確かに人為的な異常終了の仕方で、処理はうまく「片付けてる」と思っているのですが、もしかしてこれでは予想できる例外処理なので、rollbackされないということになるのでしょうか??

申し訳ありませんが、アドバイスを頂けますと有難いです。。。
よろしくお願い致します。
matobat
会議室デビュー日: 2002/02/27
投稿数: 3
投稿日時: 2005-04-30 00:15
>=== HogeAction.java =================================
>HogeDAO hogedao = new HogeDAO();
本当にこう書いてあるんですか?
HogeDAOはコンテナから取得しないとAOPが働かないので、トランザクション管理は出来ませんよ。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2005-04-30 01:34
引用:

HogeDAO hogedao = new HogeDAO();


あ、ホントですね。思い切り見逃していました・・・
これで解決かな?
たまこ
常連さん
会議室デビュー日: 2005/01/12
投稿数: 25
投稿日時: 2005-05-03 20:04
> TA2さま・Odakazさま

貴重なお答え、どうもありがとうございました。
仰るとおりの間違いの修正で、なんとか解決に至ることができました。
AOPを使用するクラスは、newしちゃいけないんですね。
SeasarのAOPの説明ページを読んで判りました。
おかげさまで、ちゃんとロールバックもしてくれて、
ログも見ることができるようになりました。

本当に皆さん、大変大変お世話になりました。
どうもありがとうございました。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2005-05-03 20:45
引用:

たまこさんの書き込み (2005-05-03 20:04) より:
AOPを使用するクラスは、newしちゃいけないんですね。


というより、DIコンテナに登録したクラスのインスタンス化は(AOPで機能を織り込むかどうかにかかわらず)、DIコンテナに任せないとDIの恩恵を受けられませんね〜

[ メッセージ編集済み 編集者: Odakaz 編集日時 2005-05-03 21:19 ]

スキルアップ/キャリアアップ(JOB@IT)