[Seasar-user:22019] Re: ESSR0308の対応

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2014年 12月 25日 (木) 01:51:08 JST


小林 (koichik) です。

> 実際に例外が発生しなくても、throws NamingExceptionを宣言するだけで
> 例外[ESSR0308]が発生する事に気付きませんでした。

それはおかしいです。
例外を宣言しているかどうかは関係なく、
実際に例外がスローされるかどうかだけで
ロールバックとマークされることが決まります。

なにか誤解があるはずなので、見直しを
オススメします。


On Wed, 24 Dec 2014 13:57:13 +0900 (JST), hanzosuperdog @ yahoo.co.jp wrote:

> 小林様
> 
> 対策方法を教えていただきありがとうございました。半蔵です。
> 下記の方法で、例外[ESSR0308]が発生しなくなりました。
> 
> >3. 例外をスローしないようにする
> 実際に例外が発生しなくても、throws NamingExceptionを宣言するだけで
> 例外[ESSR0308]が発生する事に気付きませんでした。
> 
> 以下のページも参考になりました。
> http://www.ibm.com/developerworks/jp/java/library/j_j-seasar03/
> 
> ありがとうございました。
> (返信が遅れ失礼しました。)
> 
> ----- Original Message -----
> >From: Koichi Kobayashi <koichik @ improvement.jp>
> >To: hanzosuperdog @ yahoo.co.jp; seasar-user @ ml.seasar.org 
> >Cc: "seasar-user @ ml.seasar.org" <seasar-user @ ml.seasar.org>
> >Date: 2014/12/20, Sat 22:30
> >Subject: Re: [Seasar-user:22014] ESSR0308の対応
> >  
> >小林 (koichik) です。
> >
> >直前のスレッドと類似してますが、
> >
> >http://s2container.seasar.org/2.4/ja/tx.html
> >
> >「トランザクションを開始した場合でも引き継いだ場合でも、
> >このインターセプタが適用されたメソッドが例外をスローした場合は、
> >例外の種類に応じてトランザクションがロールバックされるように
> >マークします。」
> >
> >つまり、
> >
> >public void foo() {
> >? try {
> >? ? bar();
> >? } catch (...) {
> >? ? ...
> >? }
> >? //(1)
> >}
> >
> >public void bar() {
> >? throw ...;
> >}
> >
> >foo()とbar()の両方に宣言的トランザクション
> >(どちらもRequired) が適用されている場合、
> >foo()でトランザクションが開始されてbar()は
> >そのトランザクションの中で呼び出されますが、
> >bar()が例外をスローする (bar()に適用された
> >Requiredインターセプタを例外が通り抜ける)
> >ことにより、foo()で開始したトランザクションは
> >「ロールバックとしてマーク」されます。
> >
> >そのため、上記(1)の位置で新たにJDBCコネクションを
> >取得しようとすると、コネクションを (ロールバックとして
> >マーク済みの) トランザクションに関連づけることが
> >できないために、例外[ESSR0308]が発生します。
> >
> >宣言的トランザクションが適用されたメソッドは、
> >それ自身がトランザクションを開始した場合でなくても、
> >異常終了 (例外をスロー) するとトランザクションを
> >ロールバックする、というのが基本的な動作です。
> >
> >対策としては、上記bar()に相当する (例外をスローする)
> >メソッドには:
> >
> >1. 宣言的トランザクションを適用しない
> >2. RequiresNewにして外側のトランザクションとは独立にする
> >3. 例外をスローしないようにする
> >
> >などがあります。
> >
> >
> >On Thu, 18 Dec 2014 18:29:17 +0900 (JST), hanzosuperdog @ yahoo.co.jp wrote:
> >
> >> はじめまして、半蔵です。
> >> 下記の例外が、発生して対策が必要です。
> >> 処理概要
> >> newRegist(){
> >> service1.addUser(entity);//<-LDAPのサービス
> >> ...
> >> service2..findById(userid););//<-DBのサービスで例外発生
> >> }
> >> 難しい処理は、していないのですが、なぜか例外が発生します。
> >> バージョンは、2.4.47を使っています。
> >> 調べてみましたが、原因、対策が分からないため、質問します。
> >> 
> >> 以上、よろしくお願いします。
> >> HTTPステータス 500 - org.seasar.framework.exception.SIllegalStateException: 
> >> [ESSR0308]既にロールバックとしてマークされています
> >> ________________________________
> >> 
> >> type 例外レポート
> >> メッセージ org.seasar.framework.exception.SIllegalStateException: 
> >> [ESSR0308]既にロールバックとしてマークされています
> >> 説明 The server encountered an internal error that prevented it from 
> >> fulfilling this request.
> >> 例外 
> >> javax.servlet.ServletException: org.seasar.framework.exception.SIllegalStateException: [ESSR0308]既にロールバックとしてマークされています org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433) org.seasar.struts.action.S2RequestProcessor.process(S2RequestProcessor.java:132) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:127) org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79) org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86)
> >>? org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67) org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219) org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:99) org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79) org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99) org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67) org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69) 
> >> 原因 
> >> org.seasar.framework.exception.SIllegalStateException: [ESSR0308]既にロールバックとしてマークされています org.seasar.extension.jta.TransactionImpl.throwIllegalStateException(TransactionImpl.java:138) org.seasar.extension.jta.TransactionImpl.assertActive(TransactionImpl.java:123) org.seasar.extension.jta.TransactionImpl.enlistResource(TransactionImpl.java:452) org.seasar.framework.util.TransactionUtil.enlistResource(TransactionUtil.java:64) org.seasar.extension.dbcp.impl.ConnectionPoolImpl.checkOut(ConnectionPoolImpl.java:371) org.seasar.extension.dbcp.impl.DataSourceImpl.getConnection(DataSourceImpl.java:59) org.seasar.extension.jdbc.util.DataSourceUtil.getConnection(DataSourceUtil.java:51) org.seasar.extension.jdbc.manager.JdbcManagerImpl.getJdbcContext(JdbcManagerImpl.java:381) org.seasar.extension.jdbc.query.AbstractAutoUpdate.executeInternal(AbstractAutoUpdate.java:121)
> >>? org.seasar.extension.jdbc.query.AbstractAutoUpdate.execute(AbstractAutoUpdate.java:90) org.seasar.extension.jdbc.service.S2AbstractService.insert(S2AbstractService.java:138) carebase.service.UserMstService$$EnhancedByS2AOP$$22140b31.$$insert$$invokeSuperMethod$$(UserMstService$$EnhancedByS2AOP$$22140b31.java) carebase.service.UserMstService$$EnhancedByS2AOP$$22140b31$$MethodInvocation$$insert3.proceed(MethodInvocationClassGenerator.java) org.seasar.extension.tx.DefaultTransactionCallback.execute(DefaultTransactionCallback.java:58) org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.required(JTATransactionManagerAdapter.java:65) org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:50) carebase.service.UserMstService$$EnhancedByS2AOP$$22140b31$$MethodInvocation$$insert3.proceed(MethodInvocationClassGenerator.java) org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:56)
> >>? carebase.service.UserMstService$$EnhancedByS2AOP$$22140b31$$MethodInvocation$$insert3.proceed(MethodInvocationClassGenerator.java) carebase.service.UserMstService$$EnhancedByS2AOP$$22140b31.insert(UserMstService$$EnhancedByS2AOP$$22140b31.java) carebase.action.administration.UserAccountCtlAction.newRegist(UserAccountCtlAction.java:222) carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c.$$newRegist$$invokeSuperMethod$$(UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c.java) carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c$$MethodInvocation$$newRegist5.proceed(MethodInvocationClassGenerator.java) org.seasar.extension.tx.DefaultTransactionCallback.execute(DefaultTransactionCallback.java:58) org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.required(JTATransactionManagerAdapter.java:65) org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:50)
> >>? carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c$$MethodInvocation$$newRegist5.proceed(MethodInvocationClassGenerator.java) org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:56) carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c$$MethodInvocation$$newRegist5.proceed(MethodInvocationClassGenerator.java) org.seasar.framework.aop.interceptors.ThrowsInterceptor.invoke(ThrowsInterceptor.java:79) carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c$$MethodInvocation$$newRegist5.proceed(MethodInvocationClassGenerator.java) carebase.action.administration.UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c.newRegist(UserAccountCtlAction$$EnhancedByS2AOP$$66a0ba6c.java) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >>? sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:96) org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:139) org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:87) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) org.seasar.struts.action.S2RequestProcessor.process(S2RequestProcessor.java:132) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:127) org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
> >>? org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86) org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67) org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219) org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:99) org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79) org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99) org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67) org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69) 
> >> 注意 原因のすべてのスタックトレースは、Apache Tomcat/6.0.36のログに記録されています
> >
> >
> >-- 
> >{
> >? name: "Koichi Kobayashi",
> >? mail: "koichik @ improvement.jp",
> >? blog: "http://d.hatena.ne.jp/koichik/",
> >? twitter: "@koichik"
> >}
> >
> >
> >
> >   


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



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