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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2014年 12月 20日 (土) 22:30:52 JST


小林 (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"
}



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