mysql 不加事务,出现锁问题:SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded
1. 事件还原过程
说明:因涉及隐私数据问题,所以部分数据使用 xxx 表示,涉及表使用的引擎均为:INNODB
1.1 执行批量更新操作 (更新数量较大,查询数量约为:1563787094)
# Query_time: 621.799719 Lock_time: 0.000121 Rows_sent: 0 Rows_examined: 1563787094
# SET timestamp=1637978520;
UPDATE t_advertisement as a, t_campaign as c set a.ad_id = c.ad_id WHERE a.id = c.advertisement_id;
1.2 同一时间,有新增操作,并报错 (无事务,单纯的新增)
# 新增数据:
insert into `t_campaign` xxx;
# 出错信息
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction (SQL: insert into `t_campaign` xxx)
2. 问题描述?
- 第一个操作是更新
t_advertisement
,第二个操作是新增t_campaign
,两个操作都没加事务 - 上述两个操作均没加锁,为啥报这个错误呢?
3. 扩展 sql 语句
# 查看 sql 线程
SHOW FULL PROCESSLIST;
# 查看当前运行所有的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
更新期间有其他业务操作加锁了?
有长事务 导致其他事务超时了
第一条更新 sql 的操作时间过长,把表锁了吧
写操作是自动加锁的,估计是update语句导致锁表了