[Seasar-user:21877] Re: トランザクション制御について

植木 貴紀 [E-MAIL ADDRESS DELETED]
2014年 4月 22日 (火) 05:54:01 JST


小林さま

ご返事ありがとうございます。

>> ロールバックした後の「トランザクション
>> 制御のあるアクセス」というのは、新しい
>> トランザクションを開始して、その中で
>> 接続を取得しているのでしょうか?
その通りです。
別のクラスで、新しいトランザクションを開始してアクセスしております。

>> ざっくりとでいいので関連するコードの
>> 抜粋 (概要) を見せてもらった方が話が
>> 早いかもしれません。
userTransaction.rollback();をコールする前に、
ログを出力するクラスの処理があったのですが、
そこでさらにExceptionが発生しており、
userTransaction.rollbackがコールされておりませんでした。
コネクションのステータスが、STATUS_MARKED_ROLLBACKであることも確認できま
した。
しっかりと確認できていない中、投稿してしまい申し訳ありませんでした。

ですが、まだ下記2点についての疑問が残っておりますので、ご教授いただけた
ら幸いです。

1.ロールバックがマークされているコネクションに対し、
トランザクション制御のあるDBアクセスをしているのに、エラーの発生がまちま
ちだということ。

2.今回は事象が再現しやすいように、コネクションプールのMaxSizeを1にして
おりますが、最初はデフォルト値である10を設定しておりました。
プールしてあるコネクションの割り当ての仕様をご存知でしたらご教授願いたい
です。

また、下記が例外のスタックトレースになります。

■例外のスタックトレース(前)
(手動でのトランザクション管理で、SQL発行)
java.lang.NullPointerException
	at
jp.co.test.hoge.action.MailCertificationAction.index(MailCertificationAction.java:286)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6.$$index$$invokeSuperMethod$$(MailCertificationAction$$EnhancedByS2AOP$$465a0ba6.java)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.extension.tx.DefaultTransactionCallback.execute(DefaultTransactionCallback.java:58)
	at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.never(JTATransactionManagerAdapter.java:114)
	at
org.seasar.extension.tx.NeverInterceptor.invoke(NeverInterceptor.java:38)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:73)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.ThrowsInterceptor.invoke(ThrowsInterceptor.java:79)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor.invoke(ExceptionInterceptor.java:60)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$5247834f.$$invoke$$invokeSuperMethod$$(ExceptionInterceptor$$EnhancedByS2AOP$$5247834f.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$5247834f$$MethodInvocation$$invoke0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.LoggingInterceptor.invoke(LoggingInterceptor.java:28)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$5247834f$$MethodInvocation$$invoke0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$5247834f.invoke(ExceptionInterceptor$$EnhancedByS2AOP$$5247834f.java)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.LoggingInterceptor.invoke(LoggingInterceptor.java:28)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.action.MailCertificationAction$$EnhancedByS2AOP$$465a0ba6.index(MailCertificationAction$$EnhancedByS2AOP$$465a0ba6.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:96)
	at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:139)
	at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:87)
	at
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	at
org.seasar.struts.action.S2RequestProcessor.process(S2RequestProcessor.java:132)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:127)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
	at
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
	at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
	at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
	at org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219)
	at org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:99)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
jp.co.test.hoge.filter.RaclosEncodingFilter.doFilter(RaclosEncodingFilter.java:49)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)


■例外のスタックトレース(後)
(自動でのトランザクション制御でストアドコール)

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.enlistResource(TransactionImpl.java:452)
	at
org.seasar.framework.util.TransactionUtil.enlistResource(TransactionUtil.java:64)
	at
org.seasar.extension.dbcp.impl.ConnectionPoolImpl.checkOut(ConnectionPoolImpl.java:355)
	at
org.seasar.extension.dbcp.impl.DataSourceImpl.getConnection(DataSourceImpl.java:59)
	at
org.seasar.extension.jdbc.util.DataSourceUtil.getConnection(DataSourceUtil.java:51)
	at
org.seasar.extension.jdbc.manager.JdbcManagerImpl.getJdbcContext(JdbcManagerImpl.java:381)
	at
org.seasar.extension.jdbc.query.AbstractProcedureCall.execute(AbstractProcedureCall.java:48)
	at jp.co.test.hoge.common.RaclosUtil.checkOnline(RaclosUtil.java:1202)
	at jp.co.test.hoge.action.AgreementAction.index(AgreementAction.java:71)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db.$$index$$invokeSuperMethod$$(AgreementAction$$EnhancedByS2AOP$$405d30db.java)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.InvalidateSessionInterceptor.invoke(InvalidateSessionInterceptor.java:52)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.extension.tx.DefaultTransactionCallback.execute(DefaultTransactionCallback.java:58)
	at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.required(JTATransactionManagerAdapter.java:65)
	at
org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:50)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:73)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.ThrowsInterceptor.invoke(ThrowsInterceptor.java:79)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor.invoke(ExceptionInterceptor.java:60)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$39667a85.$$invoke$$invokeSuperMethod$$(ExceptionInterceptor$$EnhancedByS2AOP$$39667a85.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$39667a85$$MethodInvocation$$invoke0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.LoggingInterceptor.invoke(LoggingInterceptor.java:28)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$39667a85$$MethodInvocation$$invoke0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.ExceptionInterceptor$$EnhancedByS2AOP$$39667a85.invoke(ExceptionInterceptor$$EnhancedByS2AOP$$39667a85.java)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.interceptor.LoggingInterceptor.invoke(LoggingInterceptor.java:28)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db$$MethodInvocation$$index0.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.test.hoge.action.AgreementAction$$EnhancedByS2AOP$$405d30db.index(AgreementAction$$EnhancedByS2AOP$$405d30db.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:96)
	at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:139)
	at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:87)
	at
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	at
org.seasar.struts.action.S2RequestProcessor.process(S2RequestProcessor.java:132)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:127)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
	at
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
	at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
	at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
	at org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219)
	at org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:90)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
	at
org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
jp.co.test.hoge.filter.RaclosEncodingFilter.doFilter(RaclosEncodingFilter.java:49)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)


(2014/04/22 4:20), Koichi Kobayashi wrote:
> 小林 (koichik) です。
> 
> ロールバックした後の「トランザクション
> 制御のあるアクセス」というのは、新しい
> トランザクションを開始して、その中で
> 接続を取得しているのでしょうか?
> 
> ざっくりとでいいので関連するコードの
> 抜粋 (概要) を見せてもらった方が話が
> 早いかもしれません。
> また、二つの例外のスタックトレースも
> みせてください。
> 
> 
> 
>> 初めて投稿させていただきます。
>> うえっきと申します。お世話になります。
>>
>>
>> トランザクションの制御を手動で行っているメソッド内で
>> (@TransactionAttribute(TransactionAttributeType.NEVER))、
>> NullPointerException発生後、ロールバック(userTransaction.rollback)を行っ
>> たトランザクションに対して、
>> 再度トランザクション制御のあるアクセスしようとすると(※1)下記エラーが
>> 発生します。
>>
>> org.seasar.framework.exception.SIllegalStateException:
>> [ESSR0308]既にロールバックとしてマークされています
>>
>> (※1)コネクションプールのMaxSizeを1に設定し、同じコネクションを使用す
>> るようにしております。
>>
>>
>> エラーは毎回発生するのではなく、発生したりしなかったりと、原因がいまいち
>> わかりません。
>>
>> userTransaction.rollback();でロールバックしており、トランザクションがク
>> ローズしていないということはないと思っています。
>>
>> 推測される原因、原因の調査方法等、ご教授いただけたら幸いです。
>> よろしくお願いいたします。
>> _______________________________________________
>> Seasar-user mailing list
>> Seasar-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-user
> 
> 




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