[Seasar-user:16051] RequiresNewTx でトランザクションが開始できない
Mitsutaka Sato
[E-MAIL ADDRESS DELETED]
2008年 10月 18日 (土) 09:49:11 JST
佐藤と申します。
いつもお世話になっております。
■DICON
<component
class="com.valuecardservice.termsrv.services.impl.AlwaysExceptionServiceImpl"
instance="prototype">
<aspect pointcut="execute">j2ee.requiredTx</aspect>
</component>
<component
class="com.valuecardservice.termsrv.services.impl.RequiresNewServiceImpl"
instance="prototype">
<aspect pointcut="execute">j2ee.requiresNewTx</aspect>
</component>
■テストケース
public void testTransaction() throws Exception {
log.debug("トランザクションを開始します。");
userTransaction.begin();
log.debug("トランザクションを開始しました。");
// RequiresTx
try {
alwaysExceptionService.execute();
} catch(Exception e) {
log.debug("エラー発生", e);
}
// RequiresNewTx
requiresNewService.execute();
if (userTransaction.getStatus() == Status.STATUS_ACTIVE) {
userTransaction.commit();
log.info("UserTransactionをコミットしました。");
}
}
上記のテストケースを実行すると、requiresNewTx の開始で以下のエラーが発生します。
org.seasar.framework.exception.SIllegalStateException:
[ESSR0308]既にロールバックとしてマークされています
at
org.seasar.extension.jta.TransactionImpl.throwIllegalStateException(TransactionImpl.java:138)
at
org.seasar.extension.jta.TransactionImpl.assertActive(TransactionImpl.java:123)
at
org.seasar.extension.jta.TransactionImpl.suspend(TransactionImpl.java:100)
at
org.seasar.extension.jta.AbstractTransactionManagerImpl.suspend(AbstractTransactionManagerImpl.java:79)
at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.suspend(JTATransactionManagerAdapter.java:191)
at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.requiresNew(JTATransactionManagerAdapter.java:75)
at
org.seasar.extension.tx.RequiresNewInterceptor.invoke(RequiresNewInterceptor.java:41)
at
com.valuecardservice.termsrv.services.impl.RequiresNewServiceImpl$$EnhancedByS2AOP$$d5eb7$$MethodInvocation$$execute0.proceed(MethodInvocationClassGenerator.java)
at
com.valuecardservice.termsrv.services.impl.RequiresNewServiceImpl$$EnhancedByS2AOP$$d5eb7.execute(RequiresNewServiceImpl$$EnhancedByS2AOP$$d5eb7.java)
at
com.valuecardservice.termsrv.services.TransactionTest.testTransaction(TransactionTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at
org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:519)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:103)
at
org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:308)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
エラーが発生した場合でもログだけはDBに記録したいということでこのような形をとっているのですが、
トランザクションの使い方がおかしいでしょうか。
エラー原因を明確にするために処理を間引いてあるので上記の例は間抜けな感じですが
実際には前後にいろいろ処理があったりするのでこのような形をとっています。
ちなみにs2-2.4.17まではエラーは発生せず、 s2-2.4.18 から上記エラーは発生します。
(今回試したのは s2-2.4.30)
以上よろしくお願いします。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20081018/cf0a7bc4/attachment-0001.html>
Seasar-user メーリングリストの案内