问题描述

批量操作的时候,遇到一个数据库死锁的问题:

  1. [31m2020-09-22 02:08:35 [gentleTaskExecutor4] INFO  n.x.g.m.c.b.i.MaterialTranscodeBizImpl - 转码插入数据库异常
  2. org.springframework.dao.DeadlockLoserDataAccessException:
  3. ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
  4. ### The error may exist in class path resource [mapper/MaterialPersonalTranscodeMapper.xml]
  5. ### The error may involve defaultParameterMap
  6. ### The error occurred while setting parameters
  7. ### SQL: insert into `material_personal_transcode`(`material_personal_id`, `transcode_task_id`, `status`, `url`, `full_url`, `material_size`, `quality`, `used`, `deleted`, `source_type`, `subscribe_id`, `tenant_id`, `create_time`, `modify_time`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  8. ### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
  9. ; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
  10. at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:267)
  11. at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
  12. at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88)
  13. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
  14. at com.sun.proxy.$Proxy117.insert(Unknown Source)
  15. at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:271)
  16. at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
  17. at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:93)
  18. at com.sun.proxy.$Proxy148.insertBatch(Unknown Source)
  19. at net.xinhuamm.gusteau.media.service.service.impl.MaterialPersonalTranscodeServiceImpl.insertBatch(MaterialPersonalTranscodeServiceImpl.java:38)
  20. at net.xinhuamm.gusteau.media.cms.biz.impl.MaterialTranscodeBizImpl.transcodePersonal(MaterialTranscodeBizImpl.java:119)
  21. at net.xinhuamm.gusteau.media.cms.biz.impl.MaterialTranscodeBizImpl$$FastClassBySpringCGLIB$$b0cc2cff.invoke(<generated>)
  22. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  23. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)
  24. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  25. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)<== Updates: 1
  26. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:353)
  27. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@73205a91]
  28. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  29. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
  30. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
  31. at net.xinhuamm.gusteau.media.cms.biz.impl.MaterialTranscodeBizImpl$$EnhancerBySpringCGLIB$$eb3862ee.transcodePersonal(<generated>)
  32. at net.xinhuamm.gusteau.media.cms.biz.impl.MaterialPersonalBizImpl.lambda$null$4(MaterialPersonalBizImpl.java:261)
  33. at java.lang.Iterable.forEach(Iterable.java:75)
  34. <== Updates: 1 at net.xinhuamm.gusteau.media.cms.biz.impl.MaterialPersonalBizImpl.lambda$executeTranscode$5(MaterialPersonalBizImpl.java:259)
  35. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  36. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@20ee3019]
  37. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  38. at java.lang.Thread.run(Thread.java:748)
  39. Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
  40. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123)
  41. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
  42. at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
  43. at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
  44. at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370)
  45. at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497)
  46. at sun.reflect.GeneratedMethodAccessor242.invoke(Unknown Source)
  47. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  48. at java.lang.reflect.Method.invoke(Method.java:498)
  49. at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
  50. at com.sun.proxy.$Proxy228.execute(Unknown Source)
  51. at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:47)
  52. at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
  53. at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
  54. at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
  55. at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
  56. at sun.reflect.GeneratedMethodAccessor247.invoke(Unknown Source)
  57. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  58. at java.lang.reflect.Method.invoke(Method.java:498)
  59. at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
  60. at com.sun.proxy.$Proxy226.update(Unknown Source)
  61. at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
  62. at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
  63. at sun.reflect.GeneratedMethodAccessor254.invoke(Unknown Source)
  64. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  65. at java.lang.reflect.Method.invoke(Method.java:498)
  66. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
  67. ... 24 more

相关问题:https://stackoverflow.com/questions/7947582/spring-transactional-deadlock