锁等待,就是session(事务会话,开启一个事务代表一个会话) A 对某行数据获取独占锁(一般就是写锁),然后session B 对相同的行进行获取独占锁就发生了锁等待。MySQL有一个保留参数innodb_lock_wait_timeout
指定死锁的时间,如果超过死锁等待时间就是报异常。
示例:
- session A 执行如下语句,开启事务,更新索引为1的语句;此时session A 获取了id=1这条语句的写锁权限:
begin
update `order` set `year`='2021' where id='1';
- session B执行如下语句,跟上面的语句一样,由于id=1这条数据的写锁已经被session A获取,故会发生锁等待的情况:
begin
update `order` set `year`='2021' where id='1';
- 等待50秒,报异常:
lock wait timeout exceeded; try restarting transaction
- 查看默认锁等待语句
show BARIABLES like 'innodb_lock_wait_timeout'