MySQL的学习笔记

69 阅读4分钟

一、MySQL索引

二、MySQL事务

三、MySQL锁

1、MySQL锁机制的由来

数据库的锁机制本身是为了解决并发事务带来的问题而诞生的,主要是确保数据库中,多条工作线程并行执行时的数据安全性。

2、MySQL锁机制的分类

  • 以锁粒度的维度划分:

    • ①表锁:

      • 全局锁:加上全局锁之后,整个数据库只能允许读,不允许做任何写操作。
      • 元数据锁 / MDL锁:基于表的元数据加锁,加锁后整张表不允许其他事务操作。
      • 意向锁:这个是InnoDB中为了支持多粒度的锁,为了兼容行锁、表锁而设计的。
      • 自增锁 / AUTO-INC锁:这个是为了提升自增ID的并发插入性能而设计的。
    • ②页面锁

    • ③行锁:

      • 记录锁 / Record锁:也就是行锁,一条记录和一行数据是同一个意思。
      • 间隙锁 / Gap锁:InnoDB中解决幻读问题的一种锁机制。
      • 临建锁 / Next-Key锁:间隙锁的升级版,同时具备记录锁+间隙锁的功能。
  • 以互斥性的维度划分:

    • 共享锁 / S锁:不同事务之间不会相互排斥、可以同时获取的锁。
    • 排他锁 / X锁:不同事务之间会相互排斥、同时只能允许一个事务获取的锁。
    • 共享排他锁 / SX锁:MySQL5.7版本中新引入的锁,主要是解决SMO带来的问题。
  • 以操作类型的维度划分:

    • 读锁:查询数据时使用的锁。
    • 写锁:执行插入、删除、修改、DDL语句时使用的锁。
  • 以加锁方式的维度划分:

    • 显示锁:编写SQL语句时,手动指定加锁的粒度。
    • 隐式锁:执行SQL语句时,根据隔离级别自动为SQL操作加锁。
  • 以思想的维度划分:

    • 乐观锁:每次执行前认为自己会成功,因此先尝试执行,失败时再获取锁。
    • 悲观锁:每次执行前都认为自己无法成功,因此会先获取锁,然后再执行。

四、MySQL中的MVCC

1、MVCC定义

MVCC机制的全称为Multi-Version Concurrency Control,即多版本并发控制技术,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。

2、MVCC原理

MVCC机制主要通过隐藏字段、Undo-log日志、ReadView实现

2.1、隐藏列

  • trx_id:最近一次改动当前这条数据的事务id
  • roll_pointer:当一个事务对一条数据做了改动后,都会将旧版本的数据放到Undo-log日志中,而rollback_pointer就是一个地址指针,指向Undo-log日志中旧版本的数据

2.2、Undo-log

每次更新记录后,都会将旧值放到一条undo日志中.不同的旧版本数据,会以roll_ptr回滚指针作为链接点,然后将所有的旧版本数据组成一个单向链表

2.3、ReadView

一个事务在尝试读取一条数据时,MVCC基于当前MySQL的运行状态生成的快照,也被称之为读视图,即ReadView,在这个快照中记录着当前所有活跃事务的ID ReadView中的核心内容

  • creator_trx_id:生成该ReadView的事务的事务id。
  • m_ids:表示在生成当前ReadView时,系统内活跃的事务id列表。
  • up_limit_id:活跃的事务列表中,最小的事务ID。
  • low_limit_id:表示在生成当前ReadView时,系统中要给下一个事务分配的ID值。

2.4、MVCC机制实现原理

  • ①当事务中出现select语句时,会先根据MySQL的当前情况生成一个ReadView
  • ②判断行数据中的隐藏列trx_idReadView.creator_trx_id是否相同:
    • 相同:代表创建ReadView和修改行数据的事务是同一个,自然可以读取最新版数据。
    • 不相同:代表目前要查询的数据,是被其他事务修改过的,继续往下执行。
  • ③判断隐藏列trx_id是否小于ReadView.up_limit_id最小活跃事务ID
    • 小于:代表改动行数据的事务在创建快照前就已结束,可以读取最新版本的数据。
    • 不小于:则代表改动行数据的事务还在执行,因此需要继续往下判断。
  • ④判断隐藏列trx_id是否小于ReadView.low_limit_id这个值:
    • 大于或等于:代表改动行数据的事务是生成快照后才开启的,因此不能访问最新版数据。
    • 小于:表示改动行数据的事务IDup_limit_id、low_limit_id之间,需要进一步判断。
  • ⑤如果隐藏列trx_id小于low_limit_id,继续判断trx_id是否在trx_ids中:
    • 在:表示改动行数据的事务目前依旧在执行,不能访问最新版数据。
    • 不在:表示改动行数据的事务已经结束,可以访问最新版的数据。

2.5、RC和RR隔离级别下的MVCC的区别

  • RC:每次读取数据前都生成一个ReadView
  • RR:在第一次读取数据时生成一个ReadView

学习竹子大佬的文章写的笔记,持续更新,作为以后遗忘后复习使用
作者:竹子爱熊猫
链接:juejin.cn/post/715535…
来源:稀土掘金