概述

以下资料是网络收集外加部分个人理解,当前数据库版本:MySQL Ver 14.14 Distrib 5.7.11, for Win64 (x86_64)。

记得以前,当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,要解决是一件麻烦的事情。特别是当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时后结束,DBA光从数据库无法着手找出源头是哪个SQL锁住了。有时候看看 show engine innodb status, 并结合 show full processlist 能暂时解决问题,但一直不能精确定位。

在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎)

Innodb锁

Innodb存储引擎实现了如下2种标准的行级锁:

共享锁(S lock),允许事务读取一行数据,select语句后加lock in share mode。

排它锁(X lock),允许事务删除或者更新一行数据,select语句后加for update。

当一个事务获取了行r的共享锁,那么另外一个事务也可以立即获取行r的共享锁,因为读取并未改变行r的数据,这种情况就是锁兼容。但是如果有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁—这种情况就是锁不兼容,二者兼容性如下表格所示:

X 排它锁

S 共享锁

X 排它锁

冲突

冲突

S 共享锁

冲突

兼容

另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),不需要我们代码控制,这两种意向锁都是表锁。

意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

意向锁的作用:

因为表锁覆盖了行锁的数据,所以表锁和行锁也会产生冲突。比如A事务申请表锁,B事务申请行级锁,或者A事务申请行级锁,B事务申请表锁。这时候B事务的申请是需要被阻塞的。那么怎么判断B事务该阻塞呢?遍历表的每一行看看是否有行级锁吗?这样效率非常差。这时候就引入了意向锁。在申请行锁前,数据库自动为我们申请了对应的意向锁,因为意向锁是表锁,这时候如果再申请表锁,就自然会阻塞了。

innodb_locks

当前出现的锁

lock_id

InnoDB内部的唯一锁ID

lock_trx_id

拥有这个锁的事务ID

lock_mode

锁模式,S, X, IS, IX等

lock_type

锁类型,RECORD或者TABLE

lock_table

被锁的表或包含被锁记录的表

lock_index

被锁的索引,不是行级锁时为NULL

lock_space

被锁的表空间号,不是行级锁时为NULL

lock_page

被锁的页号,不是行级锁时为NULL

lock_rec

被锁的Heap号,不是行级锁时为NULL

lock_data

被锁的记录的主键,不是行级锁时为NULL

innodb_lock_waits

当前等待的锁

requesting_trx_id

正在请求的、受阻的事务ID

requested_lock_id

事务正在等待的锁ID

blocking_trx_id

阻塞其他事务的事务ID

blocking_lock_id

阻塞其他事务的事务持有的锁ID

innodb_trx

当前所有事务

trx_id

InnoDB内部的唯一事务ID

trx_state

事务状态,RUNNING, LOCK WAIT等

trx_started

事务开始时间

trx_requested_lock_id

事务正在等待的锁ID

trx_wait_started

事务开始等待的时间

trx_weight

事务的权重,当发生死锁回滚的时候,优先选择该值最小的进行回滚

trx_mysql_thread_id

事务线程ID,即show full processlist中的ID

trx_query

执行的SQL语句

trx_operation_state

事务当前操作状态

trx_tables_in_use

执行当前SQL时有多少个表被使用

trx_tables_locked

执行当前SQL时有多少个表有行锁

trx_lock_structs

事务保留的锁的数量

trx_lock_memory_bytes

事务锁占据的内存大小(B)

trx_rows_locked

事务锁定的大概行数

trx_rows_modified

事务修改和插入的行数

trx_concurrency_tickets

即innodb_concurrency_tickets系统变量

trx_isolation_level

事务隔离级别

trx_unique_checks

是否唯一性检查

trx_foreign_key_checks

是否外键检查

trx_last_foreign_key_error

最后的外键错误详细信息

trx_adaptive_hash_latched

trx_adaptive_hash_timeout

trx_is_read_only

1表示事务是只读的

trx_autocommit_non_locking

1表示事务是不包含FOR UPDATE或者LOCK IN SHARE MODE语句,并且autocommit是enable的

以上翻译并不完整,如果有疑问的可以参考官网。

步骤

首先:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

获取到blocking_trx_id

然后:

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

查找trx_id和上面获取到的blocking_trx_id一样的记录,获取这条记录的trx_mysql_thread_id

最后:

kill 上面获取到的trx_mysql_thread_id

这样就把阻塞其他事务的事务线程杀掉了。

mysql 如何解锁_Mysql如何解锁?相关推荐

  1. Oracle/Mysql查看锁表与解锁表

    Oracle/Mysql查看锁表与解锁表 在ORCLA与MYSQL中,如何查看锁表与解锁表 1 Oracle 查看锁表进程SQL: select * from v$session t1, v$lock ...

  2. mysql锁表查询和解锁操作

    mysql锁表查询和解锁操作 1.在做数据库操作时,有时会因为自己的粗心或者程序设计上的缺陷导致锁表,在mysql中查看锁表和解锁的步骤如下: //1.查看当前数据库锁表的情况SELECT * FRO ...

  3. MySQL表锁了如何解锁

    MySQL表锁了如何解锁 SHOW PROCESSLIST;  -- 运行这个条命令,会出现下面截图所示内容,找到 字段 state  值中有waiting的记录,看看是不是自己需要解锁的表 字段 i ...

  4. mysql主节点数据恢复_Mysql 主从复制+数据恢复

    1.主服务器Master配置: #设置数据库标识 server_id=1 #任何一个事务提交之后就立即写入到磁盘中的二进制文件 sync_binlog=1 #保持数据一致性,建议配置 innodb_f ...

  5. iOS指纹解锁和手势解锁

    前言 一直想写博客来着,一来可以记录一些自己学习和研究的东西,二来也可以将自己写的一些东西分享出去,给他人参考,还可能收到他人的一些建议,从而完善自己的项目和提升自己的技术,这也是一种很好的技术交流方 ...

  6. mysql 汉编码 的选_peewee连接mysql汉语言数据编码_mysql

    peewee连接mysql中文数据编码 系统是win7 x64 python 2.7.6的site.py里面编码设定为 utf-8 py文件首行指定 #coding:utf-8 mysql 5.5.3 ...

  7. windows 新建mysql权限设置_Windows下设置MySQL安全权限_mysql

    注意:本文的内容涉及到修改NTFS磁盘权限和设置安全策略,请务必在确认您了解操作可能的后果之后再动手进行任何的修改. 文中提及的权限都是在原有权限上附加的权限. [修改步骤] 1.创建用户 创建一个名 ...

  8. mysql函数大全最小,MySQL函数一览_MySQL函数全部汇总

    前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...

  9. IPAD移动端交互原型通用设计方案、ipad元件库、移动元件库、元件列表、设计元件、交互示例、界面模板、设备模板、手势图标、社交界面、音乐、电商、视图控制器、指示器、指纹解锁、手势解锁、rp元件库

    IPAD移动端交互原型通用设计方案.ipad元件库.移动元件库.元件列表.设计元件.交互示例.界面模板.设备模板.手势图标.社交界面.音乐.电商.视图控制器.指示器.指纹解锁.手势解锁.rp元件库.平 ...

最新文章

  1. java jlist 更新_java – 更新JList
  2. Java项目:精美网上音乐平台(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  3. bootstrap模态框显示控制
  4. object references an unsaved transient instance【异常】
  5. React之props基本使用
  6. 100多个很有用的JavaScript函数以及基础写法大集合
  7. 哪些蔬菜基本不会使用农药?
  8. 英国政府采用开源办公套件“GovOffice”
  9. 《永不放弃-马云给创业者的24堂课》— 综合素质提升书籍
  10. 内蒙古师范大学计算机与信息工程学院--《大数据存储与处理》期末考试试卷...
  11. 山西省计算机商务学校地址,山西计算机等级考试报名地点
  12. 自学通过CISSP备考心得
  13. java加载mysql驱动_Java 加载数据库驱动(JDBC)
  14. Unity中鼠标的锁定与解锁
  15. greenplum数据导入导出
  16. opencv各lib库的功能
  17. qt中如何模拟按钮点击_Qt 实现按钮点击切换按钮图片
  18. 点餐系统-C++实现
  19. 微信公众号每日推送给女朋友的程序
  20. available 的理解和一些使用

热门文章

  1. 3.1Tableau数据可视化
  2. 广西工业职业技术学院计算机宿舍,广西工业职业技术学院宿舍条件及图片
  3. 【go语言圣经】习题答案 第一章
  4. 地理信息科学家——Michael F. Worboys
  5. 【转】关于phpcms的学习
  6. saga模式、Seata saga模式详解
  7. 单词加ed 以及 es 的规则及发音
  8. 二进制补码转换为十进制数的方法(数学层面)
  9. 如何打印好3d打印材料尼龙了?
  10. Qt实现软件从Windows到Linux跨平台