mysql事务,索引产生死锁的问题

请求并发访问这个接口

 

实现类如下

 

mysql事务,索引产生死锁的问题_第1张图片

 

第一条sql:select refid="Base_Column_List" />

from t_bank_card b

where account_id = #{accountId,jdbcType=VARCHAR} and card_no=#{cardNo,jdbcType=VARCHAR} for update

 

 

 

第二条sql:id="updateBankCardStatus" parameterType="com.credit.account.model.BankCard" >

  update t_bank_card

  

    test="status != null" >

      status = #{status,jdbcType=VARCHAR},

    

    test="updateTime != null" >

      update_time = #{updateTime,jdbcType=TIMESTAMP},

    

    test="protocolNo != null">

      protocol_no = #{protocolNo,jdbcType=VARCHAR}

    

  

  where account_id = #{accountId,jdbcType=VARCHAR} and status = #{updateStatus,jdbcType=VARCHAR}

 

 

组合索引

 

 

当第一个线程执行完select for update,第二个线程还在等待执行select for update, 第一个线程执行完update之后,第二个线程还没有执行完select for update就报错了:

 

org.springframework.dao.DeadlockLoserDataAccessException:

### Error querying database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Unknown error 1213

### The error may exist in file [D:\new\credit-service\target\classes\mapper\account\BankCardMapper.xml]

### The error may involve com.credit.account.dao.BankCardMapper.selectByAccountIdAndCardNo-Inline

### The error occurred while setting parameters

### SQL: select       b.id, b.account_id,b.card_no, b.status, b.bank_code, b.yborderid,b.create_time,b.card_top,b.card_last,b.update_time,b.bank_name,b.protocol_no         from t_bank_card b     where account_id = ? and card_no=? for update

### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Unknown error 1213

; Unknown error 1213; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Unknown error 1213

       at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:266)

       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)

       at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)

       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)

       at com.sun.proxy.$Proxy99.selectOne(Unknown Source)

       at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)

       at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:84)

       at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)

       at com.sun.proxy.$Proxy112.selectByAccountIdAndCardNo(Unknown Source)

       at com.credit.account.service.impl.BankCardServiceImpl.insertIfNotExist(BankCardServiceImpl.java:58)

       at com.credit.account.service.impl.BankCardServiceImpl$$FastClassBySpringCGLIB$$1320e81d.invoke()

       at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

       at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)

       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)

       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)

       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)

       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

       at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)

       at com.credit.account.service.impl.BankCardServiceImpl$$EnhancerBySpringCGLIB$$b464f460.insertIfNotExist()

       at com.credit.remote.baofoo.BindCardService.preBindCard(BindCardService.java:84)

       at com.credit.web.baofoo.BaofooBindCardController.preBindCard(BaofooBindCardController.java:51)

       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.doInvoke(InvocableHandlerMethod.java:189)

       at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)

       at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)

       at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)

       at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)

       at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)

       at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)

       at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)

       at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)

       at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)

       at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

       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:53)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117)

       at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

       at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       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:200)

       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)

       at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)

       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)

       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)

       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

       at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)

       at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

       at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)

       at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)

       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: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Unknown error 1213

       at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123)

       at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

       at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)

       at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970)

       at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:387)

       at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497)

       at sun.reflect.GeneratedMethodAccessor82.invoke(Unknown Source)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

       at java.lang.reflect.Method.invoke(Method.java:498)

       at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)

       at com.sun.proxy.$Proxy164.execute(Unknown Source)

       at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)

       at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)

       at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)

       at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)

       at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)

       at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)

       at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108)

       at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)

       at com.sun.proxy.$Proxy162.query(Unknown Source)

       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)

       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)

       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)

       at sun.reflect.GeneratedMethodAccessor91.invoke(Unknown Source)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

       at java.lang.reflect.Method.invoke(Method.java:498)

       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)

       ... 80 common frames omitted

你可能感兴趣的:(mysql事务,索引产生死锁的问题)