这个项目是个小项目,用户比较少,但是用户在这么少的情况下,还能出现锁等待超时的问题,由于这个项目还是部署在内网的,导致每次解决问题都只能去客户那边,难受。废话不多说,直接开讲。
首先这个报这个错的原因是:假设存在事务A和事务B,事务A一直在占用着某个资源,并且这个资源被上了锁,但是事务B也想要这个资源,那么事务B就等着事务A执行完,好把锁释放掉,把这个资源让给事务B,但是这事务A执行的时间太长了,导致事务B等待的时间也就太长了,等待时间超过了MySQL中默认的锁等待时间(50s),于是就报了这个错。
看过很多博文,大部分都是说的通过下面这条语句,查询出对应的Lock wait的那一行记录,然后找出出现锁等待的那个线程,然后使用kill,将其杀死。
select * from information_schema.INNODB_TRX;
kill trx_mysql_thread_id(就是上面那条语句查出来的对应的线程id)
然而这种方式只能说暂时的解决了锁等待的问题,难道每次出现锁等待我都去杀一次?这肯定是不现实的。所以为了根本性的解决问题,我决定开始查找出现这个问题的根本原因。
项目场景:
首先,项目中有导入数据的功能,需要各个用户对自己单位的数据进行导入,那么在导入的过程中就需要频繁的更新数据,当然,多个人可以同时导入数据,那么同时导入数据,按照我们的设计,每个人去一张表中更新属于自己的那一行数据&