[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 メーリングリストの案内