mysql 数据库(八)查询锁表

    xiaoxiao2021-03-25  236

    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  ## 锁等待的对应关系

    转载请注明原文地址: https://ju.6miu.com/read-13676.html

    最新回复(0)