[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 メーリングリストの案内