诚意满满之讲透事务隔离级别

继上一篇:诚意满满之讲透事务,这一篇讲一下事务隔离。

上一篇没看也没关系,知识点是独立的。

为什么会存在不同的事务隔离级别

首先我们先明白一件事:为了追求高性能,许多程序在设计之初往往会考虑加入并发,一旦加入并发,又面临并发带来的种种问题,为了解决并发问题,又引入了各种各样的机制。同样的,事务隔离是数据库解决并发问题的一种机制

不同的事务隔离级别是在不同情况下,追求并发安全与性能的不同选择。

这时候*大的举手了:能不能既要快,又安全?

这种既要又要且要,答案是有,只不过不是现在。如果未来的科技发展能够使得数据的读取速度跟上cpu的处理速度,那么并发将不复存在,并发带来的许多复杂问题也将迎刃而解。当然,除了并发外,还有另外一个重磅话题:缓存也将扫尽历史的垃圾堆,同样进垃圾堆的,还有不少八股文......

事务隔离级别主要分两块:

  • 事务隔离级别的定义
  • 不同隔离级别面临的问题

事务隔离级别分为四种:

  1. 读未提交(Read Uncommitted):最低的隔离级别,允许一个事务可以读取另一个事务尚未提交的数据,此时事务之间没有锁的存在。
  2. 读已提交(Read Committed):要求一个事务只能读取到其他事务已经提交的数据,这样可以避免脏读的问题。但是可能会出现不可重复读的问题,即同一个事务内两次相同的查询结果不一致。
  3. 可重复读(Repeatable Read):要求一个事务在执行过程中多次读取同样的数据时,结果应该是一致的。这可以防止脏读和不可重复读的问题。但是可能会出现幻读的问题,即同一个事务内两次相同的查询返回的记录集不一样。
  4. 串行化(Serializable):最高的隔离级别,要求事务串行执行,即每个事务在执行过程中都会对数据进行加锁,避免了并发带来的问题。但是会降低并发性能。

事务隔离级别常见的三种问题

脏读、不可重复读、幻读

脏读

脏读发生在「读未提交」这个事务隔离级别,指的是一个事务读到了另一个事务尚未提交的数据,这种现象的风险在于,一旦另一个事务回滚了,应用可能会基于已经不存在的数据继续处理,继而造成不可知的风险。

不可重复读

不可重复读存在于「读已提交」的事务隔离级别。当一个事务分两次读取数据时,前后读取到的数据可能存在不一致的情况。不可重复读指的是数据更新的情况。

幻读

与不可重复读类似,同一个事务在两次读取中,获取到不同的结果集。 注意,不可重复读指的是两次读取结果 不一样,而幻读指的是两次读取的结果集不一样。前者是数据update存在的问题,后者是数据insert时存在的问题。

相对来说,这两篇都是概念性的,篇幅短也很好理解,那么接下来就要上点强度了。知道了事务的四个特性,知道了事务隔离级别之后,如果要我们来实现,我们该怎么做呢?

他山之石可以攻玉,后面的章节我们便来看看MySQL是如何做到的。

  • mysql如何实现持久性与原子性
  • mysql如何实现事务隔离(锁与MVCC)
相关推荐
Brookty22 分钟前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
先做个垃圾出来………1 小时前
SQL的底层逻辑解析
数据库·sql
码不停蹄的玄黓1 小时前
深入拆解MySQL InnoDB可重复读(RR)隔离级别:MVCC+临键锁如何「锁」住一致性?
数据库·mysql·可重复读
paopaokaka_luck2 小时前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序
薛晓刚2 小时前
哪个领域数据库最难替换?
数据库
芷栀夏3 小时前
基于Anything LLM的本地知识库系统远程访问实现路径
数据库·人工智能
软件2053 小时前
【redis使用场景——缓存——数据淘汰策略】
数据库·redis·缓存
ChinaRainbowSea3 小时前
9-2 MySQL 分析查询语句:EXPLAIN(详细说明)
java·数据库·后端·sql·mysql
时序数据说3 小时前
Java类加载机制及关于时序数据库IoTDB排查
java·大数据·数据库·物联网·时序数据库·iotdb
deeper_wind3 小时前
MySQL数据库基础(小白的“升级打怪”成长之路)
linux·数据库·mysql