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

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

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

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

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

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

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

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

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

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

事务隔离级别分为四种:

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

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

脏读、不可重复读、幻读

脏读

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

不可重复读

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

幻读

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

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

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

  • mysql如何实现持久性与原子性
  • mysql如何实现事务隔离(锁与MVCC)
相关推荐
冒泡的肥皂2 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.3 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚6 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队6 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光6 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12016 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色6 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_7 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4537 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇7 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql