今天写完功能之后进行测试,发现程序一直报错,半天也处理不成功,之后找到报错的地方发现一条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了。