当前位置:   article > 正文

解决spring boot项目中Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote异常

prepare: no vote

        项目使用 spring boot 框架构建,持久层使用 hibernate,用 atomikos 做分布式事务管理,今天在写一个业务时,因为是需要从腾讯地图api接口拿到数据循环保存到自己本地库中,所以耗时比较长,在最后 commit 阶段控制台抛出异常信息如下:

  1. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: Prepare: NO vote
  2. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
  3. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  4. at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
  5. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  6. at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
  7. at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
  8. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
  9. at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
  10. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  11. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  12. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  13. at com.sailing.messageservice.common.SwaggerCorsFilter.doFilter(SwaggerCorsFilter.java:38)
  14. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  15. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  16. at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
  17. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  18. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  19. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  20. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
  21. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  22. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  23. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  24. at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
  25. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  26. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  27. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  28. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
  29. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  30. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  31. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  32. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
  33. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  34. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  35. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  36. at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
  37. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  38. at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  39. at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  40. at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
  41. at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
  42. at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:64)
  43. at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
  44. at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
  45. at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
  46. at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  47. at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
  48. at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
  49. at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
  50. at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
  51. at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
  52. at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  53. at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  54. at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
  55. at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
  56. at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
  57. at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
  58. at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
  59. at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
  60. at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
  61. at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
  62. at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
  63. at io.undertow.server.Connectors.executeRootHandler(Connectors.java:332)
  64. at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)
  65. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  66. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  67. at java.lang.Thread.run(Thread.java:748)
  68. Caused by: org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: Prepare: NO vote
  69. at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1026)
  70. at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
  71. at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
  72. at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
  73. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
  74. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
  75. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  76. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
  77. at com.sailing.messageservice.model.wxapp.service.WxAppService$$EnhancerBySpringCGLIB$$4d634a5c.insertMapData(<generated>)
  78. at com.sailing.messageservice.ws.wxapp.WxAppController.insertMapData(WxAppController.java:160)
  79. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  80. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  81. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  82. at java.lang.reflect.Method.invoke(Method.java:498)
  83. at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
  84. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
  85. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
  86. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
  87. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
  88. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
  89. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
  90. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
  91. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  92. ... 65 common frames omitted
  93. Caused by: javax.transaction.RollbackException: Prepare: NO vote
  94. at com.atomikos.icatch.jta.TransactionImp.rethrowAsJtaRollbackException(TransactionImp.java:66)
  95. at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:206)
  96. at com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:436)
  97. at com.atomikos.icatch.jta.UserTransactionManager.commit(UserTransactionManager.java:177)
  98. at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)
  99. ... 87 common frames omitted
  100. Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote
  101. at com.atomikos.icatch.imp.ActiveStateHandler.prepare(ActiveStateHandler.java:231)
  102. at com.atomikos.icatch.imp.CoordinatorImp.prepare(CoordinatorImp.java:681)
  103. at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:970)
  104. at com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:82)
  105. at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:336)
  106. at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:190)
  107. ... 90 common frames omitted

        网上找了好久,仅有的几篇文章也是说配置 com.atomikos.icatch.max_timeout和com.atomikos.icatch.default_jta_timeout,但是我在 application.properties 文件中配置以后还是报错,肯定的是并没有起到作用,最后在spring boot jar包下发现 AtomikosProperties 这个类,原来spring boot 自己使用 atomikos 对 JTA (Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版 的应用程序接口,在Java环境中,允许完成跨越多个XA资源的分布式事务) 进行了实现,我们可以看到配置前缀为:spring.jta.atomikos.properties, 至此我们就知道应该在配置文件  application.properties 中增加配置为:

spring.jta.atomikos.properties.default-jta-timeout = 600000  (默认为10000) 和

spring.jta.atomikos.properties.max-timeout = 600000默认为300000,网上说这个配置为0指的无限超时时间,测试设置为0还是报错

default_jta_timeout与max_timeout的区别:default_jta_timeout表示开启事务时,默认的超时时间,max_timeout表示最大的超时时间,如果default_jta_timeout设置的值大于max_timeout,会自动将超时时间截断,使用max_timeout的值(日志会打印出来),如果小于的话,将使用default_jta_timeout的时间。

  1. package org.springframework.boot.jta.atomikos;
  2. import java.util.Properties;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. /**
  5. * Bean friendly variant of
  6. * <a href="http://www.atomikos.com/Documentation/JtaProperties">Atomikos configuration
  7. * properties</a>. Allows for setter based configuration and is amiable to relaxed data
  8. * binding.
  9. *
  10. * @author Phillip Webb
  11. * @author Stephane Nicoll
  12. * @since 1.2.0
  13. * @see #asProperties()
  14. */
  15. @ConfigurationProperties(prefix = "spring.jta.atomikos.properties")
  16. public class AtomikosProperties {
  17. /**
  18. * Transaction manager implementation that should be started.
  19. */
  20. private String service;
  21. /**
  22. * Maximum timeout (in milliseconds) that can be allowed for transactions.
  23. */
  24. private long maxTimeout = 300000;
  25. /**
  26. * Default timeout for JTA transactions.
  27. */
  28. private long defaultJtaTimeout = 10000;

至此问题解决。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/346910
推荐阅读
相关标签
  

闽ICP备14008679号