복붙노트

[SPRING] Spring @ 트랜잭션이 트랜잭션을 시작하지 않음

SPRING

Spring @ 트랜잭션이 트랜잭션을 시작하지 않음

Hibernate 3에서 Spring 3을 사용하고 있습니다. Spring 선언적 트랜잭션을 구성하려고 시도하고 있지만, 시도해도 Spring 트랜잭션이 시작되지 않습니다.

여기에 내 구성이있다.

파일 : applicationContext-hibernate.xml

<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="mdbDataSource" class="org.apache.commons.dbcp.BasicDataSource">
...
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 <property name="dataSource" ref="mdbDataSource" />
  <property name="annotatedClasses">
.....
</bean>

ServiceLocator 인터페이스를 구현하는 ServiceLocatorImpl 클래스가 있습니다.

@Service("serviceLocator")
@Transactional
public class ServiceLocatorImpl implements  ApplicationContextAware, Serializable, ServletContextAware, ServiceLocator {
public ResultObject executeService( Map objArgs )
{
      if(TransactionSynchronizationManager.isActualTransactionActive()) {
          LOGGER.debug("ServiceLocator:executeService - Active transaction found");
      } else {
        LOGGER.error("No active transaction found");
      }
         ......
}
     ....
}

내 모든 구성이 맞았다 고 생각됩니다. 그러나 executeService 메소드가 호출되면 TransactionSynchronizationManager.isActualTransactionActive ()는 항상 false를 반환합니다.

이 문제를 해결하도록 도와주세요. 더 많은 정보가 필요한지 알려주십시오.

최신 정보: 다음과 같이 ServiceLocator를 다른 클래스 중 하나에 연결했습니다.

@Autowired
private ServiceLocator serviceLocator; // ServiceLocator is interface

나는 봄 3.0.0 버전을 사용하고 있습니다.

executeService ()는 ServiceLocator 인터페이스에 정의 된 메소드 중 하나입니다. 오류를 로깅하는 대신 예외를 throw하도록 코드를 업데이트했습니다. 다음은 스택 추적입니다.이 추적에서 프록시 생성이 표시되지 않습니다. 도와주세요.

    java.lang.RuntimeException: No active transaction found
at com.nihilent.venice.common.service.ServiceLocatorImpl.logTransactionStatus(ServiceLocatorImpl.java:102)
at com.nihilent.venice.common.service.ServiceLocatorImpl.executeService(ServiceLocatorImpl.java:47)
at com.nihilent.venice.web.controller.CommonController.handleRequest(CommonController.java:184)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.nihilent.venice.web.filter.DyanamicResponseHeaderFilter.doFilter(DyanamicResponseHeaderFilter.java:33)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.nihilent.venice.web.filter.RequestFilter.doFilter(RequestFilter.java:44)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)

업데이트 [해결] 문제가 해결되었습니다. 답을 수정 한 방법을 설명하기 전에 좀 더 많은 정보를 제공해야합니다. 내 프로젝트에서 Spring MVC를 사용하고있다. DispatchServlet 컨트롤은 web.xml에 구성됩니다. 이 프런트 컨트롤러에는 구성 XML 파일 abc-servlet.xml (abc은 web.xml의 서블릿 이름 임)이 있습니다. web.xml에서 컨텍스트 매개 변수로 정의 된 다른 스프링 구성 파일도 있습니다. 하나는 applicationContext-hibernate.xml 파일이다.

applicationContext-hibernate.xml 파일에서 txManager 및 을 정의했습니다. 오늘 @Autowired와 @Transactional이 함께 작동하는지 궁금 해서요. 그래서 Google에 정보를 제공하고이 스레드를 발견했습니다.

http://forum.springsource.org/showthread.php?48815-Repository-Autowired-Transaction-not-returning-proxy-and-causes-exception

스레드는 비슷한 문제에 대해 이야기하고,이 문제를 해결합니다.

제안 중 하나를 구현하고 내 서블릿의 애플리케이션 컨텍스트 xml에 을 추가하고 문제를 해결합니다.

내가 을 abc-servlet.xml 파일로 옮겼다 고 생각한 것 같습니다.

내 기록에 필요한 메시지가 표시됩니다.

[venice] DEBUG [http-8080-1] 2011 년 9 월 27 일 14 : 24 : 06,312 ServiceLocatorImpl.logTransactionStatus (100) | ServiceLocator : executeService - 활성 트랜잭션이 발견되었습니다.

도움을 주신 모든 분들께 감사드립니다. 이 정보가 도움이 될 수 있습니다. 나는 왜 그것이 이전에 일하지 않고 있었는지에 대한 설명을 듣고 싶다.

해결법

  1. ==============================

    1.내 생각 엔 당신이 뭔가를하려고하는 것입니다 :

    내 생각 엔 당신이 뭔가를하려고하는 것입니다 :

    ServiceLocator locator = new ServiceLocatorImpl();
    ...
    locator.executeService(someMap);
    

    거래가 없다는 사실에 놀랐습니다. 트랜잭션 관리와 다른 모든 Spring 서비스는 애플리케이션 컨텍스트의 Bean에만 적용된다. 인스턴스를 인스턴스화하는 대신 컨텍스트에서 인스턴스를 가져와야합니다. 그렇지 않으면 로케이터 빈은 tx : annotation-driven를 선언하는 것과는 별도의 응용 프로그램 컨텍스트에 있습니다.

    AspectJ 빌드 또는로드 타임 바이트 코드를 Spring과 함께 사용하지 않는 한.

    편집 : 문제는 정확히 제가 말한 것입니다 (두 번째 부분). 두 개의 응용 프로그램 컨텍스트를 만듭니다. 첫 번째 메소드에서 ServiceLocator를 작성했지만 두 번째 메소드에서는 주석 중심 트랜잭션 만 사용할 수 있습니다. 컨텍스트 사이의 경계를 이해하지 못하는 것처럼 보입니다. 일반적으로 적어도 내 경험에 따르면 ServiceLocator와 같은 "비즈니스"bean은 ContextLoaderListener에 의해 시작되고 contextConfigLocation을 통해 구성된 루트 컨텍스트에 있습니다. DispatcherServlet을 구성하거나 사용하는 컨트롤러 및 기타 Bean은 * -servlet.xml 파일에 의해 구성된 서블릿과 연관된 다른 컨텍스트에서 작동합니다. 이 컨텍스트는 루트 컨텍스트의 하위 컨텍스트가되고 루트 컨텍스트의 빈을 사용하여 루트 컨텍스트의 빈을 주입 할 수 있습니다.

    필자의 관점에서 볼 때, DispatcherServlet에 연결된 자식 컨텍스트에 tx : annotation-driven을 추가하여 이전보다 더 나쁜 상황을 깨뜨렸다. 대신 ServiceLocator가 루트 컨텍스트에서 만들어 졌는지 확인해야합니다. 여기서 트랜잭션 서비스는 이미 사용 가능하며 어디에 속해 있는지 확인해야합니다.

  2. ==============================

    2.단순히 "txManager"의 이름을 "transactionManager"로 변경해야합니다. EnableTransactionManagement의 JavaDoc에서 :

    단순히 "txManager"의 이름을 "transactionManager"로 변경해야합니다. EnableTransactionManagement의 JavaDoc에서 :

  3. from https://stackoverflow.com/questions/7561360/spring-transaction-not-starting-transactions by cc-by-sa and MIT license