mysql 数据库(八)查询锁表

1、查询是否锁表
show OPEN TABLES where In_use > 0;

 

2、查询进程

    show processlist
  查询到相对应的进程===然后 kill    id

 

补充:

查看正在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;  

查看等待锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

 

问题:update语句出现

RROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction报错

1,查看数据库的隔离级别:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

 

2,去查看先当前库的线程情况:

mysql> show full processlist;

没有看到正在执行的慢SQL记录线程,再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。 

mysql> SELECT * FROM information_schema.INNODB_TRX\G;

然后再去查询INNODB_TRX表,就没有阻塞的事务sleep线程存在了,如下所示:

mysql> SELECT * FROM INNODB_TRX\G;

Empty set (0.00 sec)

 

1、mysql是一个多存储引擎的数据库,在mysql中你可以理解分为两层,server层和存储引擎层
2、show full processlist看到的是server层面线程运行的状态
3、innodb_trx看到的是innodb中事务的执行情况
4、综合2和3来说,innodb是一种存储引擎,可能会出现在2和3中看到的情况不同,因为线程在处于不同状态的时候,会在不同层中工作
例如你在innodb中看到是running,但是你在server中看不到任何状态

5、我之所以加引号说阻塞,是因为你在innodb_trx中看到的状态running,表示的是有一个事务正在执行,只是事务没有提交

像你这种情况,在server层和innodb层都看不到执行的语句,说明sql语句已经执行完了,但是没有commit事务

同时需要补充的是,mysql有一个autocommit参数,在打开时,每一个dml语句都会默认为一个事务,自动帮你提价,如果关闭了,则需要手动显示提交事务

注意,ddl语句是隐式提交的

6、如果你要查看进程是什么原因阻塞的,可以查看show full processlist中的state,比较常见的是metadata lock,说明在等待元数据锁

在innodb_trx会看到lock_wait,一般是在等待行锁或者表锁

 

,information_schema 库中增加了三个关于锁的表(MEMORY引擎):
innodb_trx         ## 当前运行的所有事务
innodb_locks       ## 当前出现的锁
innodb_lock_waits  ## 锁等待的对应关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值