MySQL: Tempo limite de espera de bloqueio excedido; tente reiniciar a transação

Mensagem de erro: SQLSTATE[HY000]: Erro geral: 1205 Tempo limite de espera do bloqueio excedido; tente reiniciar o
tempo de resposta da interface de transação é muito longo, Tempo limite de espera do bloqueio excedido; tente reiniciar o erro de transação aparece no log de alarmes

razão

O banco de dados mysql adota o modo InnoDB. Assim que o bloqueio do banco de dados exceder o tempo de espera de bloqueio definido pelo parâmetro innodb_lock_wait_timeout (padrão 50s), um erro será relatado.

Uma transação está aguardando que outra transação libere o bloqueio, e outra transação retém um recurso de um recurso, fazendo com que a outra transação espere e expire. E trx_startedpode-se constatar que a transação que contém o bloqueio foi aberta antes e não foi liberada.

Resolvido :

  1. Ver transações:select * from information_schema.INNODB_TRX;
  2. killPerderfioApós a morte normal 47491; (trx_mysql_thread_id)
-- 查看事务  当前运行的所有事务
select * from information_schema.INNODB_TRX;
--查看锁   当前出现的锁
select * from information_schema.INNODB_LOCKS;
--查看锁等待   锁等待的对应关系
select * from information_schema.INNODB_LOCK_WAITS;
# 当前线程详情
show full processlist;

Consultar o tempo limite global de bloqueio de transação em espera

# 查询全局等待事务锁超时时间
SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout'
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';

+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+

Modificar tempo limite de bloqueio de transação

set innodb_lock_wait_timeout=100;
set global innodb_lock_wait_timeout=100;

ou modifique o arquivo de configuração

# my.ini文件:
innodb_lock_wait_timeout = 100

Outros métodos:

-- 排查事务的SQL
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX WHERE trx_query LIKE '%表名%';
KILL 掉执行的线程
## 查看当前被使用的表
show OPEN TABLES where In_use > 0;
-- SHOW OPEN TABLES:列举在表缓存中当前被打开的非TEMPORARY表。
-- In_use:表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用
 

SELECT
    trx_id AS  `事务ID`,
    trx_state AS `事务状态`,
    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 ;
 
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;
 
 
SELECT
  requesting_trx_id   AS  `请求锁的事务ID`,
  requested_lock_id   AS  `请求锁的锁ID`,
  blocking_trx_id     AS  `当前拥有锁的事务ID`,
  blocking_lock_id    AS  `当前拥有锁的锁ID`
FROM
  innodb_lock_waits

おすすめ

転載: blog.csdn.net/ximaiyao1984/article/details/132194921