记录Mysql锁表问题处理

今天写完功能之后进行测试,发现程序一直报错,半天也处理不成功,之后找到报错的地方发现一条SQL语句执行时间特别慢。

由于具体SQL并不复杂所以排除处理时间慢的问题。

怀疑可能是因为数据被锁住了所以导致修改失败

排查步骤如下:

1.查询数据库中正在执行的事务:

SELECT
    trx_id AS  `事务ID`,
    trx_state AS `事务状态`,
	trx_mysql_thread_id AS `线程ID`,
    trx_requested_lock_id  AS  `事务需要等待的资源`,
    trx_wait_started    AS  `事务开始等待时间`,
    trx_tables_in_use AS `事务使用表`,
    trx_tables_locked AS `事务拥有锁`,
    trx_rows_locked  AS `事务锁定行`,
    trx_rows_modified  AS `事务更改行`
FROM
    information_schema.innodb_trx ;

2.查询数据库中存在的锁

SELECT
    lock_id         AS  `锁ID`,
    lock_trx_id    AS  `拥有锁的事务ID`,
    lock_mode      AS  `锁模式    `,
    lock_type      AS  `锁类型`,
    lock_table         AS  `被锁的表`,
    lock_index         AS  `被锁的索引`,
    lock_space         AS  `被锁的表空间号`,
    lock_page      AS  `被锁的页号`,
    lock_rec       AS  `被锁的记录号`,
    lock_data      AS  `被锁的数据`
FROM
    information_schema.innodb_locks;

3.查询数据库中等待执行事务(需要在SQL执行过程中查询,否则查询不到)

SELECT
  requesting_trx_id   AS  `请求锁的事务ID`,
  requested_lock_id   AS  `请求锁的锁ID`,
  blocking_trx_id     AS  `当前拥有锁的事务ID`,
  blocking_lock_id    AS  `当前拥有锁的锁ID`
FROM
  information_schema.innodb_lock_waits;

通过上面的查询,可以确定到目前正在执行,没有释放,没有执行完毕的导致我们的正常SQL无法执行的事务线程ID。

具体的值为 information_schema.innodb_trx 表中的 trx_mysql_thread_id 字段。

通过如下命令中断事务。

kill 线程ID

之后我们就可以正常执行SQL了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值