首先来说,mysql锁的粒度分为全局锁,表锁,行锁
那么元数据属于哪个范畴中呢?
其实元数据锁属于表锁的范畴,我们在对数据库操作时,或自动加锁,
做CRUD时,会自动加上MDL读锁
对一个表的结构做出改变的时候,加的就是MDL写锁
eg:
SHOW PROCESSLIST
它用来显示当前服务器中所有活动的线程(连接)的信息
详细原理如下,如果想直接解决‘锁表’问题,直接跳到最后
-- 查看元数据锁 select OBJECT_TYPE,OBJECT_SCHEMA,OBJECT_NAME,LOCK_TYPE, LOCK_DURATION,lock_status,owner_thread_id from performance_schema.metadata_locks
这里就出现一个疑问
MDL 不需要显示调用,那它是在什么时候释放的?
MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。
这里需要注意:如果事务一不提交事务,就会一直阻塞线程
如果不下心阻塞了,没有释放,怎么去手动解锁呢?
这里,重点关注lock_status,"PENDING"代表线程在等待MDL,而"GRANTED"则代表线程持有MDL。
找到我们操作的数据
select * from performance_schema.threads where thread_id in(9228879)
查找出对应的 processlist id
可以看出processlist id为839为阻塞线程,应该kill掉