前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速理解 MySQL 事务隔离级别

快速理解 MySQL 事务隔离级别

作者头像
dys
发布2019-03-07 10:55:46
4060
发布2019-03-07 10:55:46
举报
文章被收录于专栏:性能与架构性能与架构

当数据库上有多个事务同时执行的时候,就可能出现问题:

  • 脏读(dirty read)
  • 不可重复读(non-repeatable read)
  • 幻读(phantom read)

为了解决这些问题,就有了“隔离级别”的概念,包括:

  • 读未提交的(read uncommitted)
  • 读已提交的(read committed)
  • 可重复读(repeatable read)
  • 串行化(serializable)

下面我们来解决3个问题:

  1. 脏读、不可重复读、幻读是什么意思?
  2. 每个隔离级别是什么含义?
  3. 事务隔离是怎么实现的?

事务同步问题

(1)脏读(dirty read)

示例:

在这个例子中根本不存在 id 为 1,并且 age 为 21 的记录,事务1读到了脏数据。

这就是脏读,一个事务中读到了另一个事务修改但未提交的数据。

(2)不可重复读(non-repeatable read)

示例:

不可重复读就是一个事务中读取2次同一条记录,但每次读取的结果不同。

(3)幻读(phantom read)

示例:

幻读就是在一个事务中同样的查询条件产生取得的结果不同,有新纪录产生了。

幻读其实就是不可重复读的一个特殊情况。

事务隔离级别

  • 读未提交的(read uncommitted) 是指一个事务还没有提交时,它所做的变更能够被其他事务看到。
  • 读已提交的(read committed) 是指一个事务只有在提交之后,它所做的变更才能被其他事务看到。
  • 可重复读(repeatable read)是指一个事务中看到的数据始终是一致的。
  • 串行化(serializable)会为记录加锁,出现锁冲突时,后边的事务必须等待前边的事务执行完成才能继续。

下面假设一个场景,看看不同隔离级别时的返回结果。

有一个表 T,有一个int型字段 c,包含一条记录 1

事务1

事务2

启动事务;查询得到值1

启动事务

查询得到值1

将1改成2

查询得到值 V1

提交事务

查询得到值 V2

提交事务

查询得到值 V3

不同隔离级别下的值:

  • 隔离级别为读未提交的

V1=2,此级别下事务2的更改可以被事务1看到。

V2 和 V3 同样为 2。

  • 隔离级别为读已提交的

V1=1,V2=2,此级别下事务2未提交的变更事务1看不到,提交后事务1可以看到。

V3=2。

  • 隔离级别为可重复读

V1=1,V2=1,此级别下事务1执行期间看到的值一致。

V3=2。

  • 隔离级别为串行化

事务2会被锁住,等待事务1提交。V1=1,V2=1,V3=2。

事务隔离的实现

不同事务可以看到不同的值,这是怎么实现的呢?

有一个重要概念 ”回滚日志”。

MySQL中,每条记录在更新的时候都会记录一条回滚操作记录,通过回滚操作,可以得到以前某一状态的值。

例如一个值从1依次修改到4,回滚日志就类似如下的形式:

从1改为2 <- 从3改为2 <- 从4改为3 <- 当前值为4

还有一个重要概念 “视图 read-view“,事务启动时就会创建视图,与回滚日志对应起来。

例如3个事务,产生了3个视图 A B C,和回滚日志的对应关系如下:

那么事务A取得的值始终为1,其他事务同理。即使有一个新的线程把值从4改成了5,也对其他事务没影响。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务同步问题
    • (1)脏读(dirty read)
      • (2)不可重复读(non-repeatable read)
        • (3)幻读(phantom read)
        • 事务隔离级别
        • 事务隔离的实现
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档