一、 只查一行的语句,也可能出现被锁住的三种情况
- 表锁(MDL和flush被阻塞了)
- 行锁
- 一致性读
一般碰到这种情况的话,大概率是表被锁住了。分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态;
二、一致性读和行锁问题的产生,先看下面5条sql:
select * from t where id=1 lock in share mode;
select * from t where id=1;
select blocking_id from sys.schema_table_lock_waits;
select * from information_schema.processlist where id=1;
select * from sys.innodb_lock_waits where locked_table='test'.'t'\G;
这5条语句对应的解释:
- 访问 id=1 这个记录时要加读锁,如果这时候已经有一个事务在这行记录上持有一个写锁,我们的 select 语句就会被堵住。带 lock in share mode 的 SQL 语句,是当前读,因此会直接读到 1000001(其它事物中更新的结果) 这个结果;
- 这个语句,是一致性读,要等别的事物把这个记录上的锁释放才能读到这个数据;
- 找出造成阻塞的 process id;
- 找到查询被堵住的情况;
- 查出是谁占着这个写锁;
三、常见的锁有:
- 表锁
- 行锁
- 共享锁
- 互斥锁
- 意向锁
- 间隙锁
- 记录锁
- Next-Key锁
- 插入意向锁
- AUTO-INC锁