Mysql造成锁的情况有很多,下面我们就列举一些情况:
- 执行DML操作没有commit,再执行删除操作就会锁表。
- 在同一事务内先后对同一条数据进行插入和更新操作。
- 表索引设计不当,导致数据库出现死锁。
- 长事物,阻塞DDL,继而阻塞所有同表的后续操作。
但是要区分的是Lock wait timeout exceeded与Dead Lock是不一样。
- Lock wait timeout exceeded:后提交的事务等待前面处理的事务释放锁,但是在等待的时候超过了mysql的锁等待时间,就会引发这个异常。
- Dead Lock:两个事务互相等待对方释放相同资源的锁,从而造成的死循环,就会引发这个异常。
还有一个要注意的是innodb_lock_wait_timeout与lock_wait_timeout也是不一样的。
- innodb_lock_wait_timeout:innodb的dml操作的行级锁的等待时间
lock_wait_timeout:数据结构ddl操作的锁的等待时间