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

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

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

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

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

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

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

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

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

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

事务隔离级别分为四种:

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

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

脏读、不可重复读、幻读

脏读

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

不可重复读

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

幻读

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

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

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

  • mysql如何实现持久性与原子性
  • mysql如何实现事务隔离(锁与MVCC)
相关推荐
程序员卷卷狗38 分钟前
MySQL 高可用方案:主从 + MHA + ProxySQL + PXC 的实战应用与架构思考
数据库·mysql·架构
千千寰宇1 小时前
[数据库/数据结构] LSM-Tree :结构化的日志合并树——NewSQL数据库的基石
数据库
韩立学长2 小时前
基于Springboot的研学旅游服务系统5u416w14(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
isNotNullX2 小时前
怎么理解ETL增量抽取?
数据库·数据仓库·etl·企业数字化
谅望者2 小时前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
l1t2 小时前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
honortech3 小时前
MySQL 8 连接报错:Public Key Retrieval is not allowed
数据库·mysql
q***82913 小时前
MySQL--》如何通过选择合适的存储引擎提高查询效率?
数据库·mysql·adb
q***96583 小时前
MySql-9.1.0安装详细教程(保姆级)
数据库·mysql
2501_941111403 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python