前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:谈一下对MySQL事务隔离的理解

面试官:谈一下对MySQL事务隔离的理解

原创
作者头像
王二蛋
发布2024-04-18 13:39:05
1290
发布2024-04-18 13:39:05
举报
文章被收录于专栏:MySQLMySQL

什么是事务隔离?

隔离是什么?看到“隔离”这个字眼,估计大部分人的第一反应就是“WC,阳了”,那么“隔离你”就是为了保证其他人的安全。

MySQL中的事务隔离也是这样的,主要是为了确保在并发事务执行时,各个事务之间能够相互独立、互不干扰地运行,从而保证数据的一致性。

事务的隔离级别

MySQL事务隔离为了满足不同场景,提供了4个事务隔离级别(严格来讲是InnoDB存储引擎支持的),分别是:

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

读未提交

读未提交,很好理解:事务在各自的周期内,可以读取到其他事务未提交的数据。

以下图为例,事务2的两次查询结果分别为18和19,即便事务1没有提交。

这种现象被称为“脏读”。

读已提交

读已提交,很好理解:事务在各自的周期内,每次对同一个sql进行查询都是已经提交的数据。

以下图为例,事务2的两次查询结果分别为18和19,因为在此期间事务1对数据进行了更改。

但是,这种现象被称为“不可重复读”,因为违反了事务的隔离性原则(在一个事务内,数据应该是一致的)

个人认为,在大部分情况下,可以读到已经提交过的数据,就不算是一个问题(MySQL默认的隔离级别也是这个)。

可重复读

可重复读,这样理解:既然有“不可重复读”的现象,那我满足你,让你可以重复读。

即:每个事务在自己的事务周期内,多次对同一个sql进行查询都是相同的数据。

以下图为例,事务2的两次查询结果都一样,即便在此期间事务1对数据进行了更改。

但是,如果在“可重复读”级别下进行了当前读,那么还是会出现像”读已提交“中出现的“不可重复读”的现象,不过这里称之为”幻读“(叫法真多)。

这里说下什么是当前读。

顾名思义,当前读就是读取行数据当前最新的状态,这个过程中会对所有读、写的数据加上相应的读锁、写锁、范围锁,目的是避免并发冲突。在MySQL中使用以下sql语句都属于当前读:

代码语言:sql
复制
UPDATE …
代码语言:sql
复制
DELETE …
代码语言:sql
复制
INSERT …
代码语言:sql
复制
SELECT … LOCK IN SHARE MODE
代码语言:sql
复制
SELECT … FOR UPDATE

可能会有人问:UPDATEDELETEINSERT为什么是读操作?

MySQL是如何保证数据不丢失的?》中有介绍过,在执行DML操作时,会先根据条件去查询相应的行数据,所以也存在读操作。

与当前读对应的还有快照读。快照读是一种不加锁的查询,目的是为了提高并发性能。(具体实现原理,将在后续文章中为您揭晓)

普通的SELECT语句,都属于快照读,只不过不同的隔离级别快照的时机不同。

串行化

可串行化,很好理解:并发事务的执行完全是串行,依次执行,不存在冲突导致的一致性问题。

但是可想而知,这种隔离级别的并发效率肯定极为低下。

总结

MySQL提供了多种事务隔离级别,包括读未提交、读已提交、可重复读和串行化等。这些隔离级别在并发性能和数据一致性之间提供了不同的权衡,可以根据具体的应用场景和需求来选择适合的隔离级别。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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