MySQL与隔离级别

本文导读

在这里插入图片描述

事务引言

对于数据库的事务ACID特性我在之前的一篇文章中写过: 链接,用一张图表示可以如下所示。 图中的两个矩形表示为两个事务。在一个事务中可以体现

  1. 原子性(右侧中的select update select三个操作都成功或都不成功)
  2. 一致性: 如果有多个表的话,多表之间的约束,比如外键关系要保证不被破坏
  3. 持久性: 持久性表示数据库的修改都要落到磁盘上,往往在机房断电,崩溃等重大不可中断的问题发生时体现。
    除此之外,还有再不同事务间体现的"隔离性"。
    在这里插入图片描述

事务三大伴生问题

1. 脏读

读取到未提交的数据,该数据可能在对应事务中的之后操作还有进一轮的操作,所以是"脏"的,不是最终的,不是"干净的"。
假设蓝色线是执行顺序,脏数据的读取情况可以如下表示。
在这里插入图片描述

2. 不可重复读

不可重复读是指在一个事务内,多次读同一数据,但读取到的数据不一致的情况。要注意,不可重复读要在"一个事务"中讨论。
在这里插入图片描述

3. 幻读

举个例子: A事务修改表table中的所有数据,在A事务处理时B事务往表table中插入一条数据,从A的角度看,自己明明把所有数据都修改过了,怎么还多出来一条数据? 感觉出现了幻觉似的。

MYSQL 隔离级别

mysql共有四种隔离级别,分别如下所列:
在这里插入图片描述
对于大多数据库来说,已提交读(read committed)是默认的隔离级别,但对于mysql来说,可重复读(repeateable read)是默认的隔离级别。以下关于mysql的隔离级别逐个进行表述:

1. 未提交读(read uncommitted)

未提交读是最低级的隔离级别,一般来说都不会选择这个级别。缺点不少,优点不多。正如图所示,脏读、可不重复读、幻读都它中了招。

2. 已提交读(read committed)

保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据

一个事务在未提交之前对于其他事务是不可见的。它不可见其他事务,其他事务不可见它。
从读写锁的角度看: 本级别对选定对象的写锁(独占锁)会一直保持到事务结束,但是读锁(共享锁)在SELECT操作完成后会马上释放。

  1. 不可重复读: 两个读操作间是会经历"解读锁->上读锁"的过程,在"解->上"之间可能出现其他事务修改该数据的情况,造成在一个事务中两次读数据不一致的情况。
  2. 会有幻读可能: 除了串行化,一般来说都有可能幻读

3. 可重复读(repeatable read)

这是mysql默认的隔离级别。

  1. 会有幻读可能: 除了串行化,一般来说都有可能幻读。mysql通过"索引间隙加锁"的方式避免出现幻读。

4. 串行化(seraible)

最高级的隔离级别,事务都排成一队一个个执行,不会出现问题但加锁解锁的性能开销很高,一般来说不用使用这个等级的隔离级别。

MVCC浅谈

1. 介绍

MVCC不是mysql独有的技术,在其他主流数据库中也有MVCC技术的相关实现。MVCC技术可以用来减少读锁的添加,对于大多数的"读多写少"型数据库,可以极大的提高数据库性能。

MVCC可以初略划分为乐观锁和悲观锁的类别。

在这里插入图片描述
正如图所示,MVCC主观上可以用 "每个表增加两个字段来进行表行版本控制"来理解。

2. 隔离级别和兼容性

MVCC只兼容"已提交读"、"可重复读"两个隔离级别。对于未提交读和串行化的隔离级别不兼容

3. 版本号(时间)赋值

在这里插入图片描述

参考文档

  1. https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB(%E5%9B%BE%E6%96%87%E8%AF%A6%E8%A7%A3).md
  2. https://blog.csdn.net/qq_28052907/article/details/75579201
  3. <<高性能MYSQL>>
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值