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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2014年 4月 24日 (木) 04:00:00 JST


小林 (koichik) です。

> 今回のエラー[ESSR0308]発生について下記の解釈で正しいでしょうか。

いいえ、相当に違います (^^;

まず、先の[Seasar-user:21888] での説明は
一つのスレッドにおける一つのトランザクションの
話しかしていません。
一つのスレッド上での複数のトランザクションも、
複数のスレッド (異なるリクエストの処理) も
一切関係ありません。理由は後述します。

以下のようなコードがあったとして、

userTransaction.begin();

// (1)

userTransaction.setRollbackOnly();

// (2)

userTransaction.rollback();

(1) の位置でコネクションプールからコネクションを
取得した場合 (このコネクションは現在の
トランザクションに自動的に関連づけられます)、
そのコネクションは (2) の位置 (ロールバックを
マークした後) でも使うことができます。

また、(2) の位置で (1) と同じコネクション
プールからコネクションを取得することも可能で、
その場合は (1) の位置で取得したのと同じ
(現在のトランザクションに関連づけられた)
コネクションが返されます。

一方、(1) でコネクションを取得しなかった場合、
(2) の位置 (まだトランザクションに関連づけらた
コネクションがない) でコネクションを取得しようと
すると、すでにトランザクションがロールバックと
マークされているために、プールから取り出した
コネクションをトランザクションに関連づけることが
できす、ESSR0308の例外がスローされます。

すなわち、

・(1) でコネクションを取得していれば、
  (2) でもコネクションを取得できます。

・(1) でコネクションを取得していなければ、
  (2) でコネクションを取得する際にESSR0308の
  例外がされます。


以上が発生している現象の「全て」だと考えています。
前述のように、複数のトランザクションも複数の
スレッドも関与していません。以下はその理由です。


最初のメール [Seasar-user:21874] では、
UserTransactionをロールバックした後、
「新しいトランザクション」を開始した中で
ESSR0308の例外が発生するとのことでした。

しかし、その後の [Seasar-user:21877] において
実際はrollback() が呼び出されていなかったとの
ことなので、UserTransaction#begin()によって
開始されたトランザクションは完了しておらず、
継続していることになります。

そして [Seasar-user:21877]のスタックトレースから、
「新しいトランザクション」というのはRequiredであり、
それは現在のスレッド上ですでにトランザクションが
開始されている場合 (rollback() が呼ばれていないため
まさにその状況です)、新しいトランザクションを
開始しません。
# RequiresNewなら常に新しいトランザクションを開始します。

よってESSR0308の例外は、実際には上記擬似コードの
ように、一つのトランザクションにおける (2) の位置で
起きていることになります。
そして例外が発生したりしなかったりするのは、
(1) の位置でコネクションを取得したかどうかに
依存する、ということになります。



On Wed, 23 Apr 2014 22:08:26 +0900, 植木 貴紀 <ueki @ inet.co.jp> wrote:

> 小林さま
> 
> ご返事ありがとうございます。
> 
> >> 大雑把に言うと、最初にコネクションを取得
> >> する前にトランザクションがロールバックと
> >> マークされていれば例外が発生します。
> 今回のエラー[ESSR0308]発生について下記の解釈で正しいでしょうか。
> 手動でトランザクション制御を実施している処理のエラーによって
> ロールバックとしてマークされたトランザクションが滞留している場合、
> 別の処理(別人からのアクセス)にて新しいトランザクションを開始すると滞留
> したトランザクションにコネクションを割り振ろうとすることがある。
> 
> seasar2にてコネクションをトランザクションに割り当てる際の仕様(割り当て
> 方)について分かりますでしょうか。
> また、トランザクションにコネクションを割り当てる制御について
> 特別なコーディングが必要になりますでしょうか。
> 
> 
> >> しかし、ロールバックとマークされる前に
> >> プールから取得 (およびトランザクションへ
> >> 割り当て) されたコネクションに関しては、
> >> ロールバックとマークされた後でも使うことが
> >> できます (更新系のDMLも可)。
> 上記の場合、下記の解釈でよろしいでしょうか。
> ロールバックとマークされた後でもトランザクション・コネクションはマーク前
> と同様に使用できるが、
> 別の処理(別人からのアクセス)にて開始した新しいトランザクションに上記の
> コネクションを取得、割り当てはできない。
> コネクションの再割り当てはトランザクション終了後のみ可能。
> 
> お手数かと存じますが、ご教授のほど宜しくお願い致します。
> 
> 
> (2014/04/23 4:25), Koichi Kobayashi wrote:
> > 小林 (koichik) です。
> > 
> >> 1.ロールバックがマークされているコネクションに対し、
> >> トランザクション制御のあるDBアクセスをしているのに、エラーの発生がまちま
> >> ちだということ。
> > 
> > IIllegalStateExceptionは、ロールバックと
> > マークされたトランザクションに「新しい
> > コネクション」を割り当てる際に発生します。
> > これは、コネクションプールから (その
> > トランザクション中で) 最初にコネクションを
> > 取得する際に行われます。
> > 
> > しかし、ロールバックとマークされる前に
> > プールから取得 (およびトランザクションへ
> > 割り当て) されたコネクションに関しては、
> > ロールバックとマークされた後でも使うことが
> > できます (更新系のDMLも可)。
> > 
> > 大雑把に言うと、最初にコネクションを取得
> > する前にトランザクションがロールバックと
> > マークされていれば例外が発生します。
> > 
> > 
> >> 2.今回は事象が再現しやすいように、コネクションプールのMaxSizeを1にして
> >> おりますが、最初はデフォルト値である10を設定しておりました。
> >> プールしてあるコネクションの割り当ての仕様をご存知でしたらご教授願いたい
> >> です。
> > 
> > こちらは何を知りたいのかわかりませんでした。
> > 疑問点を具体的に書いてください。
> > 
> > 
> > On Tue, 22 Apr 2014 05:54:01 +0900, 植木 貴紀 <ueki @ inet.co.jp> wrote:
> > 
> >> 小林さま
> >>
> >> ご返事ありがとうございます。
> >>
> >>>> ロールバックした後の「トランザクション
> >>>> 制御のあるアクセス」というのは、新しい
> >>>> トランザクションを開始して、その中で
> >>>> 接続を取得しているのでしょうか?
> >> その通りです。
> >> 別のクラスで、新しいトランザクションを開始してアクセスしております。
> >>
> >>>> ざっくりとでいいので関連するコードの
> >>>> 抜粋 (概要) を見せてもらった方が話が
> >>>> 早いかもしれません。
> >> 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 mailing list
> >> Seasar-user @ ml.seasar.org
> >> https://ml.seasar.org/mailman/listinfo/seasar-user
> > 
> > 
> 
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user


-- 
{
  name: "Koichi Kobayashi",
  mail: "koichik @ improvement.jp",
  blog: "http://d.hatena.ne.jp/koichik/",
  twitter: "@koichik"
}



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