简体   繁体   English

无法提交 JPA 事务; 嵌套异常 - 事务标记为 rollbackOnly

[英]Could not commit JPA transaction; nested exception - Transaction marked as rollbackOnly

Am having service class and calling a method userPlanter.sow() from the plant() method which in defined in my service class.我有服务 class 并从我的服务 class 中定义的plant()方法调用方法userPlanter.sow()

while executing the service class method and facing Transaction marked as rollbackOnly exception.在执行服务 class 方法并面对Transaction marked as rollbackOnly

Please find my service class.请找到我的服务 class。

@Service
@Transactional(readOnly = true)
public class NurseryServiceImpl implements NurseryService {

@Autowired
private UserPlanter userPlanter;

@Transactional
public SeedStatus plant() {
SeedStatus result = new SeedStatus();
userPlanter.sow(result);
return result;
}

} }

Please find my component class.请找到我的组件 class。

@Component
public class UserPlanter {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void sow(SeedStatus result) {
try {
  User[] users = readJson(getFilePath(), User[].class);
  String message = createIfNeeded(users);
  result.addStatus(message);
} catch (Exception exception) {
String message = String.format("An error occurred while seeding the users. Please inspect the server logs. %s", exception);
result.addStatus(message);
 }
}

Am facing below exception while am executing my service class method plant() .在执行我的服务 class 方法plant()时,我面临以下异常。

Please find the full stack trace.请找到完整的堆栈跟踪。

2020-04-18 18:32:42,534 [http-nio-8080-exec-1] ERROR         com.api.controller.BaseController:  83 - Unhandled exception while processing request for URL : http://localhost:8080/security/seed with exception : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:522)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at com.security.service.planter.UserPlanter$$EnhancerBySpringCGLIB$$5065e9.sow(<generated>)
at com.security.service.NurseryServiceImpl.plant(NurseryServiceImpl.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy558.plant(Unknown Source)
at com.security.controller.SeedController.seed(SeedController.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:74)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:513)
... 66 more

The problem is:问题是:

You are catching an exception inside your sow method .您在sow method中发现了一个异常。 That exception happened in your createIfNeeded method, which was probably a database access.该异常发生在您的createIfNeeded方法中,这可能是数据库访问。 Then Spring marks your transaction as to be rolled back.然后 Spring 将您的事务标记to be rolled back.

However, you are not letting that exception bubble up by catching it, hence your @Transactional annotation will lead Spring to try and commit your transaction, even though it has already been marked as to be rolled back.但是,您不会通过捕获该异常来冒泡,因此您的@Transactional注释将导致 Spring 尝试提交您的事务,即使它已被标记为回滚。

The simplest fix is to catch and rethrow the exception, or catch it outside of your @Transactional method.最简单的解决方法是捕获并rethrow异常,或者在 @Transactional 方法outside捕获它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法提交 JPA 事务:事务标记为 rollbackOnly - Could not commit JPA transaction: Transaction marked as rollbackOnly 无法提交JPA事务-RollbackException:事务标记为rollbackOnly - Can't commit JPA transaction - RollbackException: Transaction marked as rollbackOnly Jpa事务javax.persistence.RollbackException:事务标记为rollbackOnly - Jpa transaction javax.persistence.RollbackException: Transaction marked as rollbackOnly 线程“主”中的异常javax.persistence.RollbackException:事务标记为rollbackOnly - Exception in thread “main” javax.persistence.RollbackException: Transaction marked as rollbackOnly 无法提交 JPA 事务:嵌套异常是 javax.persistence.RollbackException:提交事务时出错 - Could not commit JPA transaction: nested exception is javax.persistence.RollbackException: Error while committing the transaction javax.persistence.RollbackException:事务标记为rollbackOnly - javax.persistence.RollbackException: Transaction marked as rollbackOnly RollbackException:事务标记为rollbackOnly,尽管将其设置为norollbackfor - RollbackException: Transaction marked as rollbackOnly although setting it as norollbackfor JPA eclipselink:提交时出错:事务回滚,因为事务被设置为RollbackOnly - JPA eclipselink: Error while commit: Transaction rolled back because transaction was set to RollbackOnly 无法提交 JPA 事务/提交事务时出错/NullPointerException - Could not commit JPA transaction / Error while committing the transaction / NullPointerException Spring Batch无法打开JPA EntityManager进行事务处理; 嵌套异常是java.lang.IllegalStateException:事务已处于活动状态 - Spring Batch Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: Transaction already active
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM