MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

错因:

接口时间响应较长,导致数据库无法及时添加!

一次性插入5w条数据,无法添加,时间耗时非常高,cpu出现内存溢出的情况!

MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction_第1张图片

首先使用sql语句是删除锁表

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

删除锁表

kill trx_mysql_thread_id

kill 47 即可删除因为长时间无法插入的数据的锁表!

我的sql语句是这样的

INSERT INTO `pro_product` (
  `id`,
  `model`,
  `auth_id`,
  `class_id`,
  `brand_id`,
  `tyc`,
  `pro_count`,
  `price`,
  `bth_num`,
  `packages`,
  `pro_imgUrl`,
  `pro_sort`,
  `pro_recommend`,
  `pro_status`,
  `popular_status`,
  `createTime`,
  `updateTime`,
  `pro_pdfUrl`,
  `pro_desc`,
  `pro_short_desc`,
  `identification`
)
VALUES
  < foreach collection = "TUExcelVoList" item = "TUExcelVo" SEPARATOR = "," > (NULL,
  #{TUExcelVo.model},#{TUExcelVo.authId},#{TUExcelVo.classId},#{TUExcelVo.brandId},#{TUExcelVo.tyc},#{TUExcelVo.proCount},#{TUExcelVo.price},#{TUExcelVo.bthNum},#{TUExcelVo.packages},#{TUExcelVo.imgUrl},1,1,0,0,NOW(),NOW(),#{TUExcelVo.pdfUrl},'',#{TUExcelVo.desc},(SELECT * FROM (SELECT MAX(CONCAT('TU-',(SELECT(SUBSTRING_INDEX(MAX(`identification`), '-', - 1) + 1) FROM pro_product))) FROM `pro_product`) ub))
   < / foreach >

就是一条简单的foreach添加数据语句

可是在添加sql中涵盖了查询语句,注意最后一个字段

(SELECT * FROM (SELECT MAX(CONCAT('TU-',(SELECT(SUBSTRING_INDEX(MAX(`identification`), '-', - 1) + 1) FROM pro_product))) FROM `pro_product`) ub)

解决:

关键出在这个字段(`identification`)的问题,当我在代码中插入这个数据内容,而不是通过二次查询的方式将此数据添加至数据库中。

修改后的sql语句:

INSERT INTO `pro_product` (
  `id`,
  `model`,
  `auth_id`,
  `class_id`,
  `brand_id`,
  `tyc`,
  `pro_count`,
  `price`,
  `bth_num`,
  `packages`,
  `pro_imgUrl`,
  `pro_sort`,
  `pro_recommend`,
  `pro_status`,
  `popular_status`,
  `createTime`,
  `updateTime`,
  `pro_pdfUrl`,
  `pro_desc`,
  `pro_short_desc`,
  `identification`
)
VALUES
  < foreach collection = "TUExcelVoList" item = "TUExcelVo" SEPARATOR = "," > (NULL,
  #{TUExcelVo.model},#{TUExcelVo.authId},#{TUExcelVo.classId},#{TUExcelVo.brandId},#{TUExcelVo.tyc},
   #{TUExcelVo.proCount},#{TUExcelVo.price},#{TUExcelVo.bthNum},#{TUExcelVo.packages},#{TUExcelVo.imgUrl},1,1,0,0,NOW(),NOW(),#{TUExcelVo.pdfUrl},'',#{TUExcelVo.desc},#{TUExcelVo.identification})
   < / foreach >

经过修改,插入5w条数据,只需要1s不到

这里需要根据每个人的业务及实际开发情况而定的需求所修改内容!

你可能感兴趣的:(异常,sql,数据库,mybatis,java)