美文网首页
InnoDB行锁等待

InnoDB行锁等待

作者: JunChow520 | 来源:发表于2020-07-05 21:18 被阅读0次

关键词:InnoDB、行锁、行锁等待、行锁等待超时

问题:数据库错误

Lock wait timeout exceeded;try restarting transaction

什么是锁等待(Lock Wait)呢?

当事务A对数据表进行DDL或DML操作时,数据库会为表前加表级的排它锁,添加后其它事务将该表的操作就必须等到事务A提交或回滚后才能开始。

例如:调试时如果对某个含有事务的方法断点的同时重启服务,此时数据库将会产生一个没有commit也没有rollback的事务,重启服务后如果继续执行相同的请求,对相同的数据库记录进行操作,此时产生的事务必须等待之前的事务commit或rollback。

InnoDB存储引擎出现行锁等待进而等待超时的现象?

当MySQL连接会话等待另一个会话持有的互斥锁时,会发生InnoDB引擎表行锁等待的状况。通常情况下,持有互斥锁的连接会话会迅速的执行完相关操作并释放掉持有的互斥锁(事务提交或事务回滚),进而等待的连接会话在行锁等待超时时间到来前获得该互斥行锁,来进行下一步的操作。

但在某些情况下,比如一个实例未感知到来自客户端应用的数据库连接会话已发生中断,持有该互斥锁的会话由于长时间不释放该互斥行锁,此时如果有其它连接会话前来申请该互斥行锁,此时会导致大量的行锁等待于行锁等待超时。

例如:一个事务一直没有提交或回滚,下一个已经提交的事务无法获取互斥行锁,此时就会出现行锁等待,进而产生行锁等待超时。

数据库则会抛错

Lock wait timeout exceeded;try restarting transaction

该错误说明数据库发生了行锁等待超时,但注意这里并非死锁。

MySQL系统库information_schema中有三张表用于存储事务和锁相关的数据

内置表 描述
innodb_trx 存储当前运行的所有事务
innodb_locks 存储当前出现的锁的事务
innodb_lock_waits 存储锁等待的事务

查看数据库锁并了解数据库锁占用情况,查询当前数据库正在执行的事务。

mysql> SELECT * FROM information_schema.innodb_trx;
字段 说明
trx_id 事务ID
trx_state 事务状态
trx_started 事务开始时间
trx_requested_lock_id 行锁ID
trx_wait_started 事务开始等待的时间
trx_weight 事务权重
trx_mysql_thread_id 事务线程ID
trx_query SQL查询语句
trx_operation_state 事务当前操作状态
trx_tables_in_use 事务中有多少表被使用
trx_tables_locked 事务拥有多少个锁
trx_lock_memory_bytes 事务锁住的内存大小
trx_rows_locked 事务锁住的行数
trx_rows_modified 事务更改的行数
trx_concurrency_tickets 事务并发票数
trx_isolation_level 事务隔离级别
trx_unique_checks 是否唯一性检查
trx_foreign_key_checks 是否外键检查
trx_last_foreign_key_error 最后的外键错误

使用MySQL的KILL命令杀死trx_state事务状态为LOCK WAIT的线程trx_mysql_thread_id,即可解决。但是如果处于行锁等待的事务一直没有被处理,则下一个事务就会出现Lock wait timeout exceeded;try restarting transaction行锁等待超时的错误消息。

锁等待超时时间有多久呢?

MySQL自身提供了一个innodb_lock_wait_timeout的参数来设置InnoDB放弃行锁的时间,默认为50秒。

mysql> SHOW VARIABLES LIKE "%innodb_lock_wait_timeout%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 row in set

相关文章

  • InnoDB行锁等待

    关键词:InnoDB、行锁、行锁等待、行锁等待超时 问题:数据库错误 什么是锁等待(Lock Wait)呢? 当事...

  • MySQL技术内幕InnoDB存储引擎阅读相关笔记-锁

    一、InnoDB锁 对于MyISAM引擎来说,其锁是表锁。InnoDB引擎提供行锁。 1、InnoDB行锁 1)、...

  • 阿里P8大佬带你全面了解—MySQL锁:03.InnoDB行锁

    目录 InnoDB 行锁锁排查可以用的视图和数据字典InnoDB 行锁兼容性 InnoDB行锁之共享锁共享锁: 查...

  • MySQL InnoDB 锁等待和锁等待超时的处理

    1. Innodb 引擎表行锁等待和等待超时发生的场景 当一个MySQL 连接会话等待另外一个会话持有的互斥行锁时...

  • 15.mysql锁问题(2)-InnoDB

    5. InnoDB 行锁 5.1 行锁介绍 行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁...

  • 校招面试题mysql锁总结

    目录 锁定义 锁分类 读锁和写锁 表锁和行锁 InnoDB共享锁和排他锁 InnoDB意向锁和排他锁 InnoDB...

  • InnoDB行锁

    十、 InnoDB行锁0、 查看方式1、 共享锁2、 排他锁3、 意向锁4、行锁案列5、InnoDB锁实现 0、 ...

  • Innodb的锁

    Innodb的锁是行级锁 mysql delete是否会锁表 MySQL的InnoDB存储引擎支持行级锁,Inno...

  • SQL语句加了哪些锁?

    InnoDB的锁 InnoDB 三种行锁: Record Lock(记录锁):锁住某一行记录 Gap Lock(间...

  • 数据库基础

    1 锁 1.1 InnoDB的锁 行级锁(InnoDB存储引擎实现了两种标准的)共享锁 允许事务读一行数据排他锁 ...

网友评论

      本文标题:InnoDB行锁等待

      本文链接:https://www.haomeiwen.com/subject/pxlbqktx.html