Проблема DeadLock в весенней загрузке JPA + mysql - PullRequest
0 голосов
/ 21 октября 2019

Я создаю приложение, используя данные весенней загрузки JPA и Mysql. вот мой CREATE TABLE

CREATE TABLE `game_ticket` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `delete_time` timestamp NULL DEFAULT NULL,
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `aws_match_id` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `division_id` varchar(255) NOT NULL,
  `eth_address` varchar(255) NOT NULL,
  `fee_time` timestamp NULL DEFAULT NULL,
  `game_level` int(11) NOT NULL,
  `game_type` varchar(255) DEFAULT NULL,
  `match_time` timestamp NULL DEFAULT NULL,
  `matchmaking_finished` tinyint(1) DEFAULT '0',
  `ranking` int(11) NOT NULL DEFAULT '0',
  `room_id` varchar(255) DEFAULT NULL,
  `score` double NOT NULL DEFAULT '0',
  `surrendered` tinyint(1) NOT NULL DEFAULT '0',
  `ticket_status` int(11) NOT NULL,
  `player_id` bigint(20) DEFAULT NULL,
  `token` varchar(255) DEFAULT NULL,
  `ready_timeout_processing_flag` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `IDX61903uattwpyjydqps94t394y` (`create_time`),
  KEY `IDX9snf0gw0syk8jsn3my6lyuf1i` (`update_time`),
  KEY `FKonir45vgy7io3flv7ytfqovlx` (`player_id`),
  KEY `IDX17u36mkpcmqldsu6eti8s3ijf` (`aws_match_id`),
  KEY `IDXfs8us99qis7622a5q3thk4rlv` (`ticket_status`),
  CONSTRAINT `FKonir45vgy7io3flv7ytfqovlx` FOREIGN KEY (`player_id`) REFERENCES `game_player` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1345339 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

и мой метод UPDATED, связанный с вопросом

    @Transactional(rollbackFor = Exception.class)
    @Modifying(clearAutomatically = true, flushAutomatically = true)
    @Query("update Ticket set ranking = :ranking ,ticketStatus = :ticketStatus where id = :id")
    int updateTicketRankingAndStatusById(@Param("id") long id, @Param("ticketStatus") TicketStatusEnum ticketStatus,
                                         @Param("ranking") int ranking);

Я переписал все методы UPDATE и использую только оригинальные JPA org.springframework.data.repository.CrudRepository#save только при вставке новых данных в БД,(Я дважды проверил свой код, используя Intellij для поиска использования , и я уверен, что больше нигде не используется save .)

во время стресс-теста было выдано исключение DeadLock Exception,Вот деталь исключения.


12:33:15
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:287) ~[spring-orm-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:253) ~[spring-orm-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) ~[spring-tx-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:138) ~[spring-data-jpa-2.1.9.RELEASE.jar!/:2.1.9.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) ~[spring-data-commons-2.1.9.RELEASE.jar!/:2.1.9.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at com.sun.proxy.$Proxy159.updateTicketRankingAndStatusById(Unknown Source) ~[?:?]

12:33:15
at network.celer.backend.model.TicketModel.lambda$batchUpdateTicketRankingAndStatus$0(TicketModel.java:75) ~[classes!/:0.0.1]

12:33:15
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_92]

12:33:15
at network.celer.backend.model.TicketModel.batchUpdateTicketRankingAndStatus(TicketModel.java:75) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.service.TicketService.updateMatchTicketRankingsAndSendPrize(TicketService.java:217) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.service.TicketService.processEndedMatch(TicketService.java:186) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.service.TicketService.checkAndProcessNewlySubmitTicket(TicketService.java:375) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.service.TicketService.saveNewlySubmitResult(TicketService.java:163) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.service.TicketService$$FastClassBySpringCGLIB$$1421b19f.invoke(<generated>) ~[classes!/:0.0.1]

12:33:15
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:156) ~[spring-retry-1.2.4.RELEASE.jar!/:?]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at network.celer.backend.service.TicketService$$EnhancerBySpringCGLIB$$51c7dbda.saveNewlySubmitResult(<generated>) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.controller.TicketController.submitResult(TicketController.java:87) ~[classes!/:0.0.1]

12:33:15
at network.celer.backend.controller.TicketController$$FastClassBySpringCGLIB$$414f0fe9.invoke(<generated>) ~[classes!/:0.0.1]

12:33:15
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) ~[spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at network.celer.backend.controller.response.RestfulResponseAspect.aroundAdvice(RestfulResponseAspect.java:35) [classes!/:0.0.1]

12:33:15
at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source) ~[?:?]

12:33:15
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]

12:33:15
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]

12:33:15
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) [spring-aop-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at network.celer.backend.controller.TicketController$$EnhancerBySpringCGLIB$$396f446d.submitResult(<generated>) [classes!/:0.0.1]

12:33:15
at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source) ~[?:?]

12:33:15
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]

12:33:15
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]

12:33:15
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) [spring-webmvc-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124) [druid-1.1.20.jar!/:1.1.20]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88) [spring-boot-actuator-2.1.6.RELEASE.jar!/:2.1.6.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114) [spring-boot-actuator-2.1.6.RELEASE.jar!/:2.1.6.RELEASE]

12:33:15
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104) [spring-boot-actuator-2.1.6.RELEASE.jar!/:2.1.6.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_92]

12:33:15
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_92]

12:33:15
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar!/:9.0.21]

12:33:15
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_92]

12:33:15
Caused by: org.hibernate.exception.LockAcquisitionException: could not execute statement

12:33:15
at org.hibernate.dialect.MySQLDialect$3.convert(MySQLDialect.java:546) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.hql.internal.ast.exec.BasicExecutor.doExecute(BasicExecutor.java:100) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.hql.internal.ast.exec.BasicExecutor.execute(BasicExecutor.java:59) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:453) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.engine.query.spi.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:378) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.internal.SessionImpl.executeUpdate(SessionImpl.java:1532) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.query.internal.AbstractProducedQuery.doExecuteUpdate(AbstractProducedQuery.java:1602) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

12:33:15
at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1584) ~[hibernate-core-5.3.10.Final.jar!/:5.3.10.Final]

Я использовал show engine innodb status, чтобы получить последний журнал mysql для взаимоблокировки, который в основном та же самая ситуация, что и журнал исключений.

------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-10-21 03:13:14 0x2b5e785c6700
*** (1) TRANSACTION:
TRANSACTION 20014247, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 3 row lock(s)
MySQL thread id 8243, OS thread handle 47684925896448, query id 119753044 172.31.1.170 celerx updating
update game_ticket set delete_time=null, is_deleted=0, update_time='2019-10-21 03:13:14.557', aws_match_id='b1746340-fa35-432c-972b-528027db8f5a', description=null, division_id='32344118-6aed-4cf0-633e-6784c9bf22a4', eth_address='0x62b429b22619678b79c40b4f82fa8478123fe062', fee_time='2019-10-21 03:13:04.0', game_level=3, game_type='solo', match_time='2019-10-21 03:13:06.0', player_id=6927, ranking=2, ready_timeout_processing_flag=0, room_id=null, score=46.0, surrendered=0, ticket_status=8, token='GT' where id=1148608
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 182 page no 28287 n bits 120 index PRIMARY of table `celerx_backend_db`.`game_ticket` trx id 20014247 lock_mode X locks rec but not gap waiting
Record lock, heap no 35 PHYSICAL RECORD: n_fields 24; compact format; info bits 0
 0: len 8; hex 80000000001186c0; asc         ;;
 1: len 6; hex 0000013164a8; asc    1d ;;
 2: len 7; hex 010000012a303f; asc     *0?;;
 3: len 4; hex 5dad2240; asc ] "@;;
 4: SQL NULL;
 5: len 1; hex 80; asc  ;;
 6: len 4; hex 5dad224b; asc ] "K;;
 7: len 30; hex 62313734363334302d666133352d343332632d393732622d353238303237; asc b1746340-fa35-432c-972b-528027; (total 36 bytes);
 8: SQL NULL;
 9: len 30; hex 33323334343131382d366165642d346366302d363333652d363738346339; asc 32344118-6aed-4cf0-633e-6784c9; (total 36 bytes);
 10: len 30; hex 307836326234323962323236313936373862373963343062346638326661; asc 0x62b429b22619678b79c40b4f82fa; (total 42 bytes);
 11: len 4; hex 5dad2240; asc ] "@;;
 12: len 4; hex 80000003; asc     ;;
 13: len 4; hex 736f6c6f; asc solo;;
 14: len 4; hex 5dad2242; asc ] "B;;
 15: len 1; hex 80; asc  ;;
 16: len 4; hex 80000002; asc     ;;
 17: SQL NULL;
 18: len 8; hex 0000000000004740; asc       G@;;
 19: len 1; hex 80; asc  ;;
 20: len 4; hex 8000000b; asc     ;;
 21: len 8; hex 8000000000001b0f; asc         ;;
 22: len 2; hex 4754; asc GT;;
 23: len 1; hex 80; asc  ;;

*** (2) TRANSACTION:
TRANSACTION 20014248, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 8233, OS thread handle 47684746241792, query id 119753045 172.31.0.186 celerx updating
update game_ticket set ranking=1, ticket_status=9 where id=1148607
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 182 page no 28287 n bits 120 index PRIMARY of table `celerx_backend_db`.`game_ticket` trx id 20014248 lock_mode X locks rec but not gap
Record lock, heap no 35 PHYSICAL RECORD: n_fields 24; compact format; info bits 0
 0: len 8; hex 80000000001186c0; asc         ;;
 1: len 6; hex 0000013164a8; asc    1d ;;
 2: len 7; hex 010000012a303f; asc     *0?;;
 3: len 4; hex 5dad2240; asc ] "@;;
 4: SQL NULL;
 5: len 1; hex 80; asc  ;;
 6: len 4; hex 5dad224b; asc ] "K;;
 7: len 30; hex 62313734363334302d666133352d343332632d393732622d353238303237; asc b1746340-fa35-432c-972b-528027; (total 36 bytes);
 8: SQL NULL;
 9: len 30; hex 33323334343131382d366165642d346366302d363333652d363738346339; asc 32344118-6aed-4cf0-633e-6784c9; (total 36 bytes);
 10: len 30; hex 307836326234323962323236313936373862373963343062346638326661; asc 0x62b429b22619678b79c40b4f82fa; (total 42 bytes);
 11: len 4; hex 5dad2240; asc ] "@;;
 12: len 4; hex 80000003; asc     ;;
 13: len 4; hex 736f6c6f; asc solo;;
 14: len 4; hex 5dad2242; asc ] "B;;
 15: len 1; hex 80; asc  ;;
 16: len 4; hex 80000002; asc     ;;
 17: SQL NULL;
 18: len 8; hex 0000000000004740; asc       G@;;
 19: len 1; hex 80; asc  ;;
 20: len 4; hex 8000000b; asc     ;;
 21: len 8; hex 8000000000001b0f; asc         ;;
 22: len 2; hex 4754; asc GT;;
 23: len 1; hex 80; asc  ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 182 page no 28287 n bits 120 index PRIMARY of table `celerx_backend_db`.`game_ticket` trx id 20014248 lock_mode X locks rec but not gap waiting
Record lock, heap no 34 PHYSICAL RECORD: n_fields 24; compact format; info bits 0
 0: len 8; hex 80000000001186bf; asc         ;;
 1: len 6; hex 0000013164a5; asc    1d ;;
 2: len 7; hex 010000018e0c93; asc        ;;
 3: len 4; hex 5dad2240; asc ] "@;;
 4: SQL NULL;
 5: len 1; hex 80; asc  ;;
 6: len 4; hex 5dad224b; asc ] "K;;
 7: len 30; hex 62313734363334302d666133352d343332632d393732622d353238303237; asc b1746340-fa35-432c-972b-528027; (total 36 bytes);
 8: SQL NULL;
 9: len 30; hex 33323334343131382d366165642d346366302d363333652d363738346339; asc 32344118-6aed-4cf0-633e-6784c9; (total 36 bytes);
 10: len 30; hex 307832353034393166646561333866323538343663613936383635326462; asc 0x250491fdea38f25846ca968652db; (total 42 bytes);
 11: len 4; hex 5dad2240; asc ] "@;;
 12: len 4; hex 80000001; asc     ;;
 13: len 4; hex 736f6c6f; asc solo;;
 14: len 4; hex 5dad2242; asc ] "B;;
 15: len 1; hex 80; asc  ;;
 16: len 4; hex 80000001; asc     ;;
 17: SQL NULL;
 18: len 8; hex 0000000000804940; asc       I@;;
 19: len 1; hex 80; asc  ;;
 20: len 4; hex 80000009; asc     ;;
 21: len 8; hex 8000000000001b3a; asc        :;;
 22: len 2; hex 4754; asc GT;;
 23: len 1; hex 80; asc  ;;

*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
Trx id counter 20045023
Purge done for trx's n:o < 20045023 undo n:o < 0 state: running but idle
History list length 31
----------

Вот самое странное. В журнале Innodb мы видим первичный ключ блокировки Innodb для , где id = 1148608 , и он говорит: 3 блокировки строк . Зачем блокировать 3 строки вместо 1?

и sql

update game_ticket set delete_time=null, is_deleted=0, update_time='2019-10-21 03:13:14.557', aws_match_id='b1746340-fa35-432c-972b-528027db8f5a', description=null, division_id='32344118-6aed-4cf0-633e-6784c9bf22a4', eth_address='0x62b429b22619678b79c40b4f82fa8478123fe062', fee_time='2019-10-21 03:13:04.0', game_level=3, game_type='solo', match_time='2019-10-21 03:13:06.0', player_id=6927, ranking=2, ready_timeout_processing_flag=0, room_id=null, score=46.0, surrendered=0, ticket_status=8, token='GT' where id=1148608

в журнале говорится, что я где-то запускаю save , пока я проверяю, потому что у меня нетМетод ОБНОВЛЕНИЯ выглядит следующим образом (не так долго)Я полагал, что эти два оператора имеют одинаковый aws_match_id , который является индексом таблицы, поэтому DEADLOCK происходит. После попытки innodb повторить транзакцию, процесс прошел нормально, но я очень хотел бы решить проблему DEADLOCK. В коде я обновляю рейтинг только двух TICKET, чей aws_match_id одинаковый

    public List<Ticket> batchUpdateTicketRankingAndStatus(List<Ticket> tickets) {
        if (CollectionUtils.isEmpty(tickets)) {
            return tickets;
        }
        tickets.forEach(ticket -> ticketRepository.updateTicketRankingAndStatusById(ticket.getId(), ticket.getTicketStatus(), ticket.getRanking()));
        return tickets;
    }

Может кто-нибудь сказать мне, почему вызывается эта полная таблица UPDATE sql и происходит DEADLOCK

...