mysql手册12_锁机制


锁是协调多个线程并发访问某一资源的机制(避免资源的争抢)

锁的分类

  • 以对数据库的操作粒度划分:表锁(操作时锁定整个表)、行锁(锁定当前行)
  • 以对数据库的操作类型划分:读锁(共享锁)、写锁(排他锁)

共享锁:多个事务可并发读取数据,但任何事务都不可获取数据的排它锁(写),除非已释放所有共享锁

排它锁:某个事务获得了排它锁,其他事务不能读取也不能修改


各存储引擎对锁的支持情况:

存储引擎 表级锁 行级锁 页面锁
MyISAM 支持 不支持 不支持
InnoDB 支持 支持 不支持
MEMORY 支持 不支持 不支持
BDB 支持 不支持 支持

3种锁的特性:

锁类型 特点
表级锁 偏向MyISAM存储引擎,开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁 偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高
页面锁 开销和加锁时间中等,会出现死锁,锁定粒度中等,并发度一般

MyISAM存储引擎的表锁

在执行查询语句前,MyISAM会 自动 给涉及的表加上 读锁
在执行更新操作前,MyISAM会 自动 给涉及的表加上 写锁

对 MyISAM 表的读操作,不会阻塞其他事务对同一个表的读操作,但会阻塞其他事务对该表的写操作
对 MyISAM 表的写操作,则会阻塞其他事务对同一表的读和写操作

所以 MyISAM 不适合做以写为主的表的存储引擎

列举当前状态在表缓存中当前被打开的表,In_use不等于0表示该表正在被锁定
show open tables+--------------------+---------------------------+--------+-------------+
| Database           | Table                     | In_use | Name_locked |
+--------------------+---------------------------+--------+-------------+
| mysql              | default_roles             |      0 |           0 |
| mysql              | check_constraints         |      0 |           0 |
| mysql              | slave_master_info         |      0 |           0 |
................
................
................
查看表锁的情况
show status like 'Table_locks%';+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Table_locks_immediate | 9     |
| Table_locks_waited    | 0     |
+-----------------------+-------+Table_locks_immediate 表示能够立即获得表级锁的次数
Table_locks_waited 表示需要等待获取表锁的次数,该值较高说明存在严重的表级锁的争用情况

InnoDB存储引擎的行锁

InnoDB 与 MyISAM 的最大不同有两点:支持事务、采用行级锁

并发事务带来的问题

问题 含义
丢失更新 多个事务操作同一行数据时,后提交的事务修改的值会覆盖前面提交的事务修改的值
脏读 一个事务访问到了另一个事务还没有提交的数据
不可重复读 同一事务中执行了两次相同的查询,得到的结果不一致
幻读 事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了

使用事务的隔离级别来解决以上问题

隔离级别 丢失更新 脏读 不可重复读 幻读
Read uncommitted X Y Y Y
Read committed X X Y Y
Repeatable read (默认) X X X Y
Serializable X X X X

注:当 Where 查询条件中的字段没有索引,或者索引失效时,InnoDB 默认的行锁更新操作将变为表锁!应该尽量避免!

间隙锁
间隙锁(Gap Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制,在更新操作中如果进行了范围查询,此时的行级锁将无法满足要求,需要对一定范围的行数据进行加锁

举例:数据库中存在id为1,3,4,5,6 的数据,缺少id为2的数据

A事务执行以下更新操作,此时范围 id<5 的行数据将被加锁

update t_user set name = "zhangsan" where id < 5

同时B事务执行以下 insert 语句,此时B事务将进入阻塞状态,直至A事务提交

insert into t_user values(2,'lisi');

注:尽量缩小范围区间以避免间隙锁

查看InnoDB的行锁争用情况:

show status like 'innodb_row_lock%';+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+Innodb_row_lock_current_waits   当前正在等待行锁的数量
Innodb_row_lock_time            锁定的总时长
Innodb_row_lock_time_avg        锁定的平均时长
Innodb_row_lock_time_max        锁定的最大时长
Innodb_row_lock_waits           系统启动至今总共等待的次数

总结:

虽然 InnoDB 在锁机制上的性能损耗比 MyISAM 高,但在整体并发处理能力方面远远优于 MyISAM

优化建议:

  • 尽可能让所有数据的检索通过索引完成,以避免行锁升级为表锁
  • 合理涉及索引,尽量缩小锁的范围
  • 尽可能减少索引条件和索引范围,避免间隙锁
  • 尽量控制事务大小,减少锁定的资源量和锁定的时间长度
  • 尽可能使用低级别的事务隔离(在满足业务需求的前提下)

mysql手册12_锁机制相关推荐

  1. 深入浅出MySQL事务处理和锁机制

    深入浅出MySQL事务处理和锁机制 2015-01-13 架构师之旅 1. 事务处理和并发性 1.1. 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置 ...

  2. MySQL事务分析和锁机制分析

    MySQL事务分析和锁机制分析 事务 事务控制语句 目的 组成 特征 概念 redo日志 undo日志 MVCC多版本并发控制Multi version concurrency control ACI ...

  3. mysql innodb 的锁机制_Mysql之Innodb锁机制详解

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.关于事务我们之前有专题介绍,这里就着重介绍下它的锁机制. 总的来说,InnoDB按照不同的分类共有 ...

  4. 【数据库】MySQL中的锁机制

    MySQL中的锁机制 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则. MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种 ...

  5. 总结一下MySQL中的锁机制

    今天来简单总结一下MySQL的锁机制,不妥的欢迎拍砖! 1.对于MySQL来说,有三种锁的级别:页级.表级.行级. 页级的典型代表引擎为BDB. 表级的典型代表引擎为MyISAM,MEMORY以及很久 ...

  6. MySQL数据库:锁机制

    当数据库中多个事务并发存取同一数据的时候,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.MySQL锁机制的基本工作原理就是,事务在修改数据库之前,需要先获得相应的锁,获得锁的 ...

  7. MySQL事务及锁机制大揭秘 - 公开课笔记

    Spring事务和数据库事务有什么区别? Spring提供了一个类,由这个类以AOP的方式管理,只需要@Transactional即可 为什么要有事务? 事务的基本概念:要不然全成功,要不然全失败,为 ...

  8. 阿里mysql锁_【mysql】mysql中的锁机制

    一.分类 MySQL的锁机制不同的存储引擎支持不同的锁机制,分为表级锁.行级锁.页面锁.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的 ...

  9. Mysql InnoDB 的锁机制

    目录 前言 1. 锁的分类 1.1 实现方式 1.2 锁的粒度 2. 查询操作加锁方式 2.1 一致性非锁定读 2.2 一致性锁定读 3. 锁的算法 4. 锁的升级 5. 死锁 6.总结 前言 锁机制 ...

  10. MySQL中的锁机制、MyISAM表锁、MyISAM表级锁争用情况、MyISAM并发插入Concurrent Inserts、MyISAM的锁调度

    前言: 关于读锁.写锁.乐观锁.悲观锁.行锁.表锁的理解可以看看以前我写的: 读锁.写锁.乐观锁.悲观锁.行锁.表锁 内部锁:在MySQL服务器内部执行的锁,以管理多个会话对表内容的争用.这种类型的锁 ...

最新文章

  1. LeetCode简单题之二叉搜索树的最小绝对差/最小距离
  2. 计算机未识别网络什么意思,win7 64位系统提示当前连接到未识别的网络怎么办...
  3. 测试框架 Jest 实例教程
  4. 同域名下不同端口cookie问题
  5. Python-线程的生命周期
  6. 压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题
  7. Java笔记-读取资源文件应该注意的问题(大文件解析、\r\n分割相关的)
  8. [脚本编程] 过云盾、D盾各种盾shell
  9. python爬虫菜鸟教程-Python 应该怎么学?
  10. [ 总结 ] 删除通过find查找到的文件
  11. Windows Server上用命令来起停IIS站点
  12. OpenCV之图像腐蚀
  13. ui-router 路由重定向
  14. 软件工程2 需求获取
  15. STEP 7 MicroWIN SMART编程软件PG_PC以太网接口搜索不到CPU怎么办?
  16. 新手建站必看,怎么选择主机空间?
  17. cydia加载未能连接服务器请求超时,cydia无法加载请求超时(一招教你解决)
  18. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究
  19. Android10.0CarAudioZone(一)
  20. 部署ChatGPT(在VPS或免费容器上),无需科学上网!

热门文章

  1. cad vba 打开文件对话框_CADvba开发手册.doc
  2. html返回顶部开始隐藏,回到顶部并且监听顶部按钮显示或隐藏
  3. Matlab数字图像处理——图像增强
  4. SketchUp-2022版本
  5. 最新emoji表情代码大全_由一个 emoji 引发的思考
  6. 知网显示html,使用知网HTML阅读的正确姿势
  7. 【图纸加密】命令lockdwg转换为多重属性块
  8. 无法读源文件或磁盘_磁盘阵列RAID1+0和RAID0+1的区别
  9. 如何在手机端抓https的报文
  10. 投标是个技术活,不这样做要么苟且,要么狗带