[ERROR][org.hibernate.engine.jdbc.spi.SqlExceptionHelper]Lock wait timeout

hibernate数据库在进行多条数据插入数据库时报上述错误。查了很多解决方案,原因是代码中有事务没提交,导致锁,最后总结如下:

sql = "select pks.orgId,so.name,sum(ifnull(pks.result01,0)+ifnull(pks.result02,0)+ifnull(pks.result03,0)+ifnull(pks.result04,0)+ifnull(pks.result05,0)+ifnull(pks.result06,0)+ifnull(pks.result07,0)+ifnull(pks.result08,0)+ifnull(pks.result09,0)+ifnull(pks.result10,0)+ifnull(pks.result11,0)+ifnull(pks.result12,0)+ifnull(pks.result13,0)+ifnull(pks.result14,0)+ifnull(pks.result15,0)+ifnull(pks.result16,0)+ifnull(pks.result17,0)+ifnull(pks.result18,0)+ifnull(pks.result19,0)+ifnull(pks.result20,0)) as px,count(pks.orgId) as py,sum(ifnull(pks.result01,0)+ifnull(pks.result02,0)+ifnull(pks.result03,0)+ifnull(pks.result04,0)+ifnull(pks.result05,0)+ifnull(pks.result06,0)+ifnull(pks.result07,0)+ifnull(pks.result08,0)+ifnull(pks.result09,0)+ifnull(pks.result10,0)+ifnull(pks.result11,0)+ifnull(pks.result12,0)+ifnull(pks.result13,0)+ifnull(pks.result14,0)+ifnull(pks.result15,0)+ifnull(pks.result16,0)+ifnull(pks.result17,0)+ifnull(pks.result18,0)+ifnull(pks.result19,0)+ifnull(pks.result20,0))/count(pks.orgId) as pz,pks.surveytype "
       + " from pip_kpi_satisfaction pks,sys_organization so "
       + " where pks.orgid=so.id and pks.surveyyear='"+year+"' "
       + " group by pks.orgId,so.name,pks.surveytype";
   List lsTotal = totalStatisticDao.findBySql(sql);
   for(Object[] obj:lsTotal)
   {
    TTotalStatistic t = new TTotalStatistic();
    t.setYear(year);
    t.setOrgId(Long.parseLong(obj[0].toString()));
    t.setOrgName(obj[1].toString());
    t.setTotalScore(Double.parseDouble(obj[2].toString()));
    t.setIndCount(Integer.parseInt(obj[3].toString()));
    t.setAverageScore(Double.parseDouble(obj[4].toString()));
    t.setSurveytype(Integer.parseInt(obj[5].toString()));
    //t.setWeightScore(Double.parseDouble(obj[4].toString()));
    totalStatisticDao.save(t);
   }  

方案一:重新启动服务器数据库,或者用备份数据库(简单粗暴,不想追根的朋友可以试一试,但是基于寻求问题本质的思想,建议了解方案二)

方案二:1、首先查看数据库当前所有线程情况mysql> show full processlist;

            2、再去查看innodb的事务表INNODB_TRX,mysql> SELECT * FROM information_schema.INNODB_TRX\G;看一下里面是否有正在锁定的事务线程,如果有正在锁定的事务,将此表的ID与1中的对比,如果在1中此线程为sleep,说明此线程没有commit,卡住了。

            3、mysql> kill xxx; 此处xxx为刚才事务线程的ID;

            此时再去执行我们的sql语句就ok了。

方案三:方案二适用于mysql版本5.5以上,博主版本5.1,苦逼的发现并没有innodb_trx这张表,所以又有了方案三

1、首先查看数据库当前所有的线程情况mysql>show full processlist;

[ERROR][org.hibernate.engine.jdbc.spi.SqlExceptionHelper]Lock wait timeout_第1张图片

2、查看本机ip,将这张表所有和你本机IP相同的进程全部kill掉。

你可能感兴趣的:(hibernate,Mysql)