面试---聊一下MySql的隔离级别

MySql有四种隔离级别

- Read Uncommitted(读取未提交内容)
- Read Committed(读取提交内容)
- Repeatable Read(可重读)
- Serializable(可串行化)


Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。这也造成了脏读这种问题。

  1. 事务A读取数据
  2. 事务B更新数据,但未提交
  3. 事务A再读数据,发现数据发生变化
  4. 事务B回滚
  5. 事务A再读数据,数据回到初始化

脏读,读取未提交的数据

Read Committed(读取提交内容)

在该隔离级别,事务只能读取已提交的事务的执行结果。

该隔离级别解决了脏读,但是出现了不可重复读问题。即事务两次查询,但是结果不一致。是因为在此期间,别的事务更新了数据并提交,即不可重复读

像Orcal这种数据库都采用该隔离级别。

Repeatable Read(可重读)

为了解决不可重复读问题,现在提出Repeatable Read(可重读)。

  1. 事务A初始化读取数据
  2. 事务B更新数据并提交
  3. 事务A正常读取数据,数据并未改变
  4. 事务A提交本次事务,并再次提交,可读更新后的数据

该隔离级别易造成幻读,即读取数据并不是最新的数据

Serializable(可串行化)

即先来先用

  1. 事务A初始化使用数据
  2. 事务B想要使用同一份数据,必须等待事务A结束使用
  3. 事务A提交事务
  4. 事务B可使用该数据

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。


介绍完了四种隔离级别,来了解MYsql为什么要使用可重读RR作为默认隔离级别,Orcal为什么要用读已提交RC作为默认级别

binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。

在mysql 5以前,binlog只有statement一种格式。现在有三种格式

  • statement:记录的是修改SQL语句
  • row:记录的是每行实际数据的变更
  • mixed:statement和row模式的混合

为什么MySql默认使用RR隔离级别?
只有statement这种格式,在主从复制时候,会有大量的不一致这样的bug。所以mysql选择RR作为默认隔离级别。
为什么Orcal这些数据库用RC作为默认隔离级别?

  1. 在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!
  2. 在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行
  3. 在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!

在RC级用别下,主从复制用什么binlog格式?
row格式,是基于行的复制!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值