MySQL5.5后,默认存储引擎是InnoDB,5.5之前默认是MyISAM。

InnoDB(事务性数据库引擎)和MyISAM的区别补充:

  1. InnoDB是聚集索引,数据结构是B+树,叶子节点存K-V,V存的是数据页。MyISAM是非聚集索引,V上存的是主键值,查到主键后还需要从聚集索引上再查一次。
  2. InnoDB是具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。适合存在大量insert、update场景
  3. MyISAM强调的是性能,不支持事务,最大缺陷就是崩溃后无法安全恢复,更适合读密集的小型应用
  4. InnoDB支持MVCC(多版本控制)。应对高并发事务, MVCC比单纯的加锁更高效,所以InnoDB更适合高并发场景
  5. InnoDB支持外键
  6. MyISAM支持数据压缩

常用命令

//查所有引擎
mysql> show engines;
//查当前引擎
mysql> show variables like '%storage_engine%';

InnoDB的行级锁

InnoDB支持的行级锁,包括如下几种:

  • Record Lock:对索引项加锁,锁定符合条件的行,其他事务不能修改和删除加锁项。

  • Gap Lock:对索引项之间的“间隙”加锁,锁定记录的范围(对第一条记录前的间隙或最后一条将记录后的间隙加锁),不包含索引项本身。其他事务不能在锁范围内插入数据,这样就防止了别的事务新增幻影行。

  • Next-key Lock:锁定索引项本身和索引范围。即Record Lock和Gap Lock的结合。可解决幻读问题。

  • innodb对于行的查询使用next-key lock

  • Next-locking keying为了解决Phantom Problem幻读问题

  • 当查询的索引含有唯一属性时,将next-key lock降级为record key

  • Gap锁设计的目的是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生

  • 有两种方式显式关闭gap锁(除了外键约束和唯一性检查外,其余情况仅使用record lock):

    -- 将事务隔离级别设置为RC

    -- 将参数innodb_locks_unsafe_for_binlog设置为1

InnoDB的行级锁是基于索引实现的,如果查询语句未命中任何索引,那么InnoDB会使用表级锁。

不同于MyISAM总是一次性获得所需的全部锁,InnoDB的锁是逐步获得的,当两个事务都需要获得对方持有的锁,导致双方都在等待,这就产生了死锁。发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退。

避免死锁:

  • 通过表级锁来减少死锁产生的概率;
  • 多个程序尽量约定以相同的顺序访问表(哲学家就餐问题);
  • 同一个事务尽可能做到一次锁定所需要的所有资源。

表级锁和行级锁可以进一步划分为共享锁(s)和排他锁(X)。

参考

《MySQL应知应会》

《Java工程师修炼之道》

https://blog.csdn.net/qq_34337272/article/details/80611486

最新文章

  1. springmvc+mybatis+spring 整合 bootstrap html5
  2. [问答] Firemonkey 控件继承后无法显示(空白)
  3. 基于ARM处理器的反汇编器软件简单设计及实现
  4. UI第九节——UIProgressView
  5. Spring Boot中的注解
  6. 【转】JavaScript下对去重算法的优化
  7. Codeforces Round #375 (Div. 2) - B
  8. Json2JsonArray JsonArray2StringArray
  9. 微软测试版Visual Studio for Mac下载
  10. HDU 5410 CRB and His Birthday
  11. IntelliJ IDEA于Make Project时报:子字符串不是票面金额的结束、非法的表达式显示启动
  12. Fragment多重嵌套实现电影,影院展示页
  13. linux-高并发与负载均衡-lvs-功能配置介绍
  14. MVC autofac 属性注入
  15. mapper接口方法参数
  16. ueditor 百度编辑器图片上传 接 node.js 及一些前端自定义
  17. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案
  18. 移动端过禁止输入emoji表情实现方案
  19. [cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件
  20. 20190122 loop

热门文章

  1. Git指令大全
  2. Redis-内存优化(一)
  3. CVPR2020论文解读:CNN合成的图片鉴别
  4. GPU加速:宽深度推理
  5. CVPR2020:训练多视图三维点云配准
  6. CVPR2020:点云分析中三维图形卷积网络中可变形核的学习
  7. MapReduce —— MapTask阶段源码分析(Output环节)
  8. P2365 任务安排
  9. 【NX二次开发】获取尺寸信息UF_DRF_ask_draft_aid_text_info
  10. 生成树协议(STP)