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

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

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

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

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

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

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

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

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

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

事务隔离级别分为四种:

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

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

脏读、不可重复读、幻读

脏读

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

不可重复读

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

幻读

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

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

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

  • mysql如何实现持久性与原子性
  • mysql如何实现事务隔离(锁与MVCC)
相关推荐
NCIN EXPE2 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台2 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路2 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家2 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE2 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow122 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO2 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623922 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele2 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python