前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一博 - 浅析事务隔离级别& MVCC机制

每日一博 - 浅析事务隔离级别& MVCC机制

作者头像
小小工匠
发布2023-05-29 10:18:27
2660
发布2023-05-29 10:18:27
举报

DB四个隔离级别

数据库隔离允许事务执行,就像没有其他并发运行的事务一样。

下面的图说明了四个隔离级别。

  • Serializalble: 这是最高的隔离级别。并发交易保证按顺序执行。
  • Repeatable Read: 事务开始时读取的数据保持不变。
  • Read Committed: 只有事务提交后,数据修改才能被其他事务读取。
  • Read Uncommitted: 数据修改可以在事务提交前被其他事务读取。

MVCC如何工作的 ?

隔离性是通过MVCC(多版本一致性控制)和锁来保证的。

下图以Repeatable Read为例,演示MVCC如何工作:

  • 每行有两个隐藏列:transaction_id和roll_pointer。
  • 当事务A开始时,创建一个新的读视图,transaction_id=201。
  • 一会儿过后事务B开始后,创建一个新的读视图,transaction_id=202。
  • 现在,事务A将余额修改为200,创建日志的新行,并且roll_pointer指向旧行。
  • 在事务A提交之前,事务B读取余额数据。事务B发现transaction_id 201尚未提交,它读取下一个已提交的记录(transaction_id=200)。
  • 即使事务A提交,事务B仍然基于事务B开始时创建的读视图读取数据。所以事务B总是读取余额=100的数据。

MVCC通过为每行记录创建多个版本,并且为每个事务生成一个时间点快照(Read View),实现非阻塞读和隔离性。 这种机制允许并发事务同时读取数据,而不会堵塞其他事务

在这里插入图片描述
在这里插入图片描述

小结

MySQL 的 MVCC(多版本并发控制)机制主要包含以下几个方面:

  1. 行版本(Version):MySQL 为每行记录维护多个版本,每个版本都有唯一的版本号(Version Number)。
  2. 事务ID(Trx ID):每个事务开始时,会分配一个唯一的事务ID,用于标识事务在时间轴上的位置。
  3. 快照(Snapshot):当事务开始时,MySQL 会为其创建一个快照,快照中包含此时数据页中所有版本和对应事务ID。事务执行期间,所有读请求都在此快照中查找版本。
  4. 时间轴位置判断:事务需要判断其他版本的事务ID是否早于自己,以判断其是否可见。如果早于自己,说明其已提交,自己可见;否则,不可见。
  5. 行版本生成:事务更新数据时,会生成行的新版本,并把新版本的事务ID设置为自己的ID。其他事务只有在此事务提交后,新版本才对其可见。
  6. 事务回滚:如果事务回滚,其生成的所有新行版本都会被移除,不会对其他事务产生影响。
  7. MVCC自更新问题:事务A读取一行,事务B也读取并修改了此行,此时事务A再修改此行。为避免覆盖,事务A生成新版本,并阻塞事务B的修改,等待其提交或回滚。

通过版本判断和控制,MVCC可以实现不同隔离级别下的并发控制:

  • Repeatable Read:利用快照实现
  • Read Committed:通过时间轴判断可见版本实现
  • Read Uncommitted:所有版本都可见

所以,MySQL MVCC 通过行版本和时间轴判断来控制并发事务间的隔离和一致性,这是MySQL并发控制的基石。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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