MySQL知识点复习 - 事件篇

[复制链接]
发表于 2026-1-29 00:44:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
MySQL知识点复习 - 事件篇

由于在线上真没用过MySQL,一样寻常用的都是PostgreSQL、Oracle和Sql Server,美满对八股文的神MySql没有一丝线上履历,故来小卷一手。
事件的特性是什么?


  • 原子性:实验的任务要么是一次完成要么就是全部是失败,都会被回滚到事件前的状态
  • 划一性:事件在操纵前和操纵后无论干了什么数据都是划一的
  • 隔离性:防止多个事件并发的时间由于交织实验而导致数据差别等
  • 长期性:事件处置惩罚竣事后对于数据的修改是永世长期性的
怎么实现的?

在MySQL的InnoDB引擎技能中,长期性是通过 redo log(重做日志日志)来包管的,原子性通过 undo log(回滚日志日志),隔离性通过MVCC(多版本并发控制)或是🔒机制来实现的。划一性则是通过上述是三个特性来完成的。
事件的隔离级别有哪些?

插播一条知识点:
在同时处置惩罚多个并发的时间,就会容易出现三种环境,

  • 脏读:如果有一个事件读取到还没有提交的事件的时间,也就是脏读(由于这个事件大概会撤回)
  • 不可重复读:简单的明确就是连续读的数据都差别等。就是当有此中一个事件,比如说是事件A,他自己search了一次数据,但是并没有什么操纵,然后事件B,操纵了提交了事件,修改了这个数据,当事件A再search一次这个数据的时间,发现数据已经差别等了,这个就是不可重复读。
  • 幻读:(记载数目)字面意思感觉产生了幻觉。比如事件A在举行条件查询,根据这个条件筛选出来的数据照旧正常的,但是同时在事件B也在举行查询,这个时间各人都照旧正常的,就在这个时间,事件A开始偷偷对这个数据举行了操纵,然后事件B再举行一次查询的时间,发现怎么数据多了一条?这个就是幻读。(这听起来怎么跟不可重复读差不多?)但是,实在这个只有在一个事件内多次举行条件筛选条件时间出现的标题,才会叫做幻读。(而不可重复读只是单纯的多次读取同一个数据,这就是差异。)


  • 读未提交:在事件还没有提交的时间,各人就能看到它已经修改了什么内容
这里就大概会出现脏读、不可重复读和幻读的征象,在提交之前如果挂了是不是就得全部回滚了

  • 读提交:必要等全部的步调完成事件提交,各人才气看到终极的修改内容
这种就不会出现脏读的环境,那么是不是大概也会出现不可重复读和幻读的征象呢

  • 可重复读:指在事件的实验过程时到事件开始的时间的数据都是划一的。(MySQL默认的隔离级别)
这种环境会有大概出现幻读的环境

  • 串行化:会对当条件交的事件先加上读写锁,当有多个事件进来,造成了读写辩说,背面来的事件就必须等前面的事件实验完毕了之后才气继续实验。
加锁导致的多半只是性能差,但是安全性肯定是高的
研究一下什么是MVCC

MVCC允许多个事件同时读取同一条数据,而不会相互壅闭,每个事件看到的版本都是事件开始时的数据版本,也就是说,每个人看到的数据,都是自己在操纵时开始看到的数据,换个意义来说这就黑白壅闭的读操纵。
Read View:简单的明确他就是一个数据快照,复杂的明确他就是一个类似于视图的东西吗?(这是我的明确),Read view内里会有几个字段,恣意捞几个出来分析一下:

  • creator_trx_id:创建这个read view事件的事件id
  • m_ids:在创建read view的时间,有一些事件启动了但是却还没有提交的事件的id列表,这个是列表,看字段名也是ids不是id。
  • min_trx_id:这个是m_ids的最小值
  • max_trx_id:创建read view的时间数据库预备给下一个事件预备的id值
插播小知识
在InnoDB引擎中,在每个表中都会有两个隐蔽的字段

  • trx_id:事件的id会存放在这个字段中
  • roll_pointer:指针列,指向旧版本的记载
创建Read View的时间,可以将trx_id分别为下面的这个版本链,以这种版本链的情势天生的就叫做MVCC多版本并发控制。
已提交事件 -> (天生min_trx_id最小的m_ids值)-> 已启动但未提交的事件 -> (天生max_trx_id最大的m__ids值)-> 还没有开始的事件
另有那么几种环境必要分析一下


  • 当的trx_id小于Read view的最小值的时间,证实这个事件是之前的事件创建的read view,是已经提交了的事件,以是这条数据的终极版本我们是可以看到的。
  • 当trx_id大于或便是read view的最小值的时间,证实这个事件是在创建read view后才天生的事件,以是这条数据的终极版本我们是还不可以看到的。
  • 如果trx_id在ids的最小值和最大值之间的时间,就必要判定这个trx_id是不是在m_ids这个列表之中了

    • 如果在列表中,证实这个照旧一个未提交的事件,以是是看不到终极的版本
    • 如果不在列表中,证实这个事件已经被提交了,可以看到终极的版本。

wtf ?? 好复杂人被搞晕了
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表