龙空技术网

终于稍微有点理解mysql的锁了

Sys浆糊 35

前言:

此时我们对“mysql 表解锁”大概比较关怀,你们都想要分析一些“mysql 表解锁”的相关资讯。那么小编在网上汇集了一些对于“mysql 表解锁””的相关文章,希望我们能喜欢,朋友们一起来学习一下吧!

Mysql锁分为事务锁和Metadata锁,不同解锁方法不同。

对于事务锁,做如下实验产生事务锁:

设置锁等待时间:

set global innodb_lock_wait_timeout=3600;

打开一个mysql session,发起事务:

start transaction;

select * from t1 for update;

另外开一个mysql session ,对t1表进行更改:

update t1 set dname='111' where id=2;

发现进入锁状态了:

然后开始解决锁故障,

查询表sys.innodb_lock_waits可以看到锁信息:

select * from sys.innodb_lock_waits\G

有查询到的信息可以发现,等待的id时24,阻塞id时30,我们查看processlist可以看到相关线程内容:

根据建议把kill 掉id号30这个线程就可以释放。

执行完kill,确实就可以继续。

对于metadata锁比较复杂一点

继续做实验:

先启动一个事务:

然后另外启一个session,做ddl操作:

这样就产生一个metadata锁。

通过sys.innodb_lock_waits无法查到metadata锁。

需要查select * from information_schema.innodb_trx\G,查找当前未结束的事务。

可以查找到2个事务,一个是我们要执行ddl语句的事务,另一个是空闲未结束的事务。

找到事务的线程id,把线程杀掉.

杀掉一个ddl语句就执行成功。

这就是事务锁和metadata锁解锁的方法。

另外还有一个metadata锁的解锁方法,直接查询

select * from sys.schema_table_lock_waits where waiting_pid!=blocking_pid\G

根据提示杀掉对应的connection id

标签: #mysql 表解锁