[Seasar-user:17067] Re: S2Tx 処理結果を登録したい

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 3月 17日 (火) 17:00:40 JST


小林 (koichik) です.

Date:    Tue, 17 Mar 2009 08:30:52 +0900
From:    溝口 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:17064] S2Tx 処理結果を登録したい

> 今回、新たに発生した処理で、
> ある複数件のレコードをデータベースへ登録するという物があり、
> 登録結果(エラーの場合理由)もデータベースに保存するという
> 物があります。
(略)
> やりたいこと、validateRecordでValidateExceptionが発生した場合、
> targetテーブルにインサートしたデータを消したい。
> ログテーブルに書かれるデータは残したい。

target テーブルの更新とログテーブルの更新を別の
トランザクションにするのがよいかと.

成功時も別のトランザクションにするか,失敗時だけ
別にするかにもよりますが,例えば

  public UserTransaction userTransaction;

  public void exec(List<HogeArg> argList){
    for(int i=0;i<argList.size();i++){
      HogeArg hogeArg = argList.get(i);
      try{
        validateRecord(hogeArg);
        targetDao.insert(targetDxo.convert(hogeArg));
      }catch(ValidateException ve){
        userTransaction.setRollbackOnly();
        recordErrorLog(argList, ve.getErrorId, i);
        return;
      }
    }
    LogEntity logEntity = new LogEntity();
    log.setRowCount(argList.size());
    logDao.insert(log);
  }

  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  public void recordErrorLog(List<HogeArg> argList, Integer errorId, Integer errorRowNumber){
    LogEntity logEntity = new LogEntity();
    log.setRowCount(argList.size());
    log.setErrorRowNumber(errorRowNumber);
    log.setResult(errorId);
    logDao.insert(log);
  }

例外発生時は UserTransaction#setRollbackOnly() を
呼び出すことで,exec() に設定されたトランザクションは
ロールバックされます.
# 実際には SystemException のハンドリングが必要です.

recordErrorLog() は @TxAttribute アノテーションで
新しいトランザクションを開始することを指定しているため,
ログの記録は呼び出し元のトランザクションの影響を
受けません.

@TransactionAttribute を利用するには
txAttributeCustomizer を使用します.

http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeployTransaction


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内