三分钟图解事务隔离级别,看一遍就懂

前文说过,”锁” 是数据库系统区别于文件系统的一个关键特性,其对象是 事务,用来锁定的是数据库中的对象,如表、页、行等。锁确实提高了并发性,但是却不可避免地存在一些潜在的 并发一致性问题

不过好在锁只会带来四种问题(丢失更新、脏读、不可重复读、幻读),如果可以防止这四种情况的发生,那将不会产生并发异常。为此,ISO 和 ANIS SQL 标准制定了四种 事务隔离级别标准,用来对应地解决锁带来的几种问题。

锁带来的四种并发一致性问题

丢失更新 Last To Modify

缺少更新很容易理解。简单地说,一个事务的更新操作会被另一个事务的更新操作覆盖,导致数据不一致。

[En]

Missing updates is easy to understand. To put it simply, * the update operation of one transaction will be overwritten by the update operation of another transaction, resulting in data inconsistency.*

举个例子:

1)事务 T1 将行记录 r 更新为 v1,但是事务 T1 并未提交

2)与此同时,事务 T2 将行记录 r 更新为 v2,事务 T2 未提交

3)事务 T1 提交

4)事务 T2 提交

如下图所示,显然,事务 T1 丢失了自己的修改。

三分钟图解事务隔离级别,看一遍就懂

但事实上,这并不完全会发生。

[En]

But, in fact, this is not exactly going to happen.

因为我们说过对于行进行更新操作的时候,需要对行或其他粗粒度级别的对象加锁,因此当事务 T1 修改行 r 但是没提交的时候,事务 T2 对行 r 进行更新操作的时候是会被阻塞住的,直到事务 T1 提交释放锁。

所以, 从数据库层面来讲,数据库本身是可以帮助我们阻止丢失更新问题的发生的

然而,在实际的开发环境中,我们经常会遇到逻辑缺失的更新。例如:

[En]

However, in a real development environment, we often encounter * logical missing updates * . For example:

1)事务 T1 查询一行数据 r,放入本地内存,并显示给一个用户 User1

2)事务 T2 也查询该行数据,并将取得的数据显示给另一个用户 User2

3)User1 修改了行记录 r 为 v1,更新数据库并提交

4)User2 修改了行记录 r 为 v2,更新数据库并提交

显然,最终这行记录的值是 v2,User1 的更新操作被 User2 覆盖掉了,丢失了他的修改。

三分钟图解事务隔离级别,看一遍就懂

可能还是云里雾里,我来举个 更现实点的例子吧,一个部门共同查看一个在线文档,员工 A 发现自己的性别信息有误,于是将其从 “女” 改成了 “男”,就在这时,HR 也发现了员工 A 的部门信息有误,于是将其从 “测试” 改成了 “开发”,然后,员工 A 和 HR 同时点了提交,但是 HR 的网络稍微慢一点,再次刷新,员工 A 就会发现,擦,我的性别怎么还是 “女”?

三分钟图解事务隔离级别,看一遍就懂

脏读 Dirty Read

所谓脏读,就是说 一个事务读到了另外一个事务中的 “脏数据”,脏数据就是指事务未提交的数据

如下图所示,在事务并没有提交的前提下,事务 T1 中的两次 SELECT 操作取得了不同的结果:

三分钟图解事务隔离级别,看一遍就懂

注意,如果想要再现脏读这种情况,需要把隔离级别调整在 Read UnCommitted(读取未提交)。所以事实上脏读这种情况基本不会发生,因为现在大部分数据库的隔离级别都至少设置成 READ COMMITTED

不可重复读 Unrepeatableread

不可重复读取意味着同一数据集在一个事务内被多次读取。在事务结束之前,另一个事务访问相同的数据集并进行一些修改。因此,在第一个事务中的两次读取之间,第一个事务读取的数据可能会因为第二个事务的修改而不同。

[En]

Non-repeatable reading means that the same data set is read multiple times within a transaction. Before the transaction ends, another transaction accesses the same data set and makes some modifications. Therefore, * between the two reads in the first transaction, the data read by the first transaction may be different because of the modification of the second transaction.*

举个例子:事务 T1 读取一行数据 r,T2 将该行数据修改成了 v1。如果 T1 再次读取这行数据,此时读取的结果和第一次读取的结果是不同的

三分钟图解事务隔离级别,看一遍就懂

不可重复读取和脏读取之间的区别在于,脏读取是读取未提交的数据,而不可重复读取是已提交的数据,但它违反了事务一致性的要求。

[En]

The difference between unrepeatable reading and dirty reading is that dirty reading is reading uncommitted data, while unrepeatable reading is committed data, but it violates the requirement of transaction consistency.

幻读 Phantom Read

幻影阅读本质上是一种不可重复的阅读。不同的是,不可重复读取主要针对数据的更新(即事务的两次读取结果不同)。虚读主要针对数据的增加或减少(即事务的两次读取返回的结果数量不同)。

[En]

Phantom reading is essentially a case of unrepeatable reading. the difference is that unrepeatable reading is mainly aimed at the update of data (that is, the results of the two reads of the transaction are different). The phantom reading is mainly aimed at the increase or decrease of data (that is, the number of results returned by the two reads of the transaction is not the same).

举个例子:事务 T1 读取某个范围的数据,事务 T2 在这个范围内插入了一些新的数据,然后 T1 再次读取这个范围的数据, 此时读取的结果比第一次读取的结果返回的记录数要多

三分钟图解事务隔离级别,看一遍就懂

四种事务隔离级别标准

SQL 标准定义了四种越来越严格的事务隔离级别,用来解决我们上述所说的四种事务的并发一致性问题。

1) READ UNCOMMITTED 读取未提交:事务中的修改,即使没有提交,对其它事务也是可见的。

如上所述,数据库本身已经具有防止丢失更新的能力,也就是说,即使是最低隔离级别也可以防止丢失更新。所以:

[En]

As mentioned above, the database itself already has the ability to prevent lost updates, that is, even the lowest isolation level can prevent lost updates. So:

  • 这个隔离级别可以阻止 丢失更新

2) READ COMMITTED 读取已提交:一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。

  • 这个隔离级别可以阻止 丢失更新 + 脏读

3) REPEATABLE READ 可重复读(InnoDB 存储引擎默认的隔离级别):保证在同一个事务中多次读取同一数据的结果是一样的

  • 这个隔离级别可以阻止 丢失更新 + 脏读 + 不可重复读

4) SERIALIZABL 可串行化:强制事务串行执行(需要使用锁机制来实现),这样多个事务互不干扰,不会出现并发一致性问题。

  • 这个隔离级别可以阻止 丢失更新 + 脏读 + 不可重复读 + 幻读

三分钟图解事务隔离级别,看一遍就懂

您可以看到,四个隔离级别可以防止越来越多的并发一致性问题,但这并不意味着隔离级别越高越好,因为事务隔离级别越高,数据库的性能成本就越大。

[En]

You can see that more and more concurrency consistency problems can be prevented by the four isolation levels, but it does not mean that the higher the isolation level, the better, because the higher the transaction isolation level, the greater the performance cost of the database.

另外,多提一嘴,InnoDB 存储引擎在 REPEATABLE READ 事务隔离级别下,使用 Next-Key Lock 锁的算法避免了幻读的产生。也就是说,InnoDB 存储引擎在其默认的 REPEATABLE READ 事务隔离级别下就已经能完全保证事务的隔离性要求了,即达到了 SQL 标准的 SERIALIZABLE 隔离级别。

🎉 关注公众号 | 飞天小牛肉,即时获取更新

  • 博主东南大学硕士在读,携程 Java 后台开发暑期实习生,利用课余时间运营一个公众号『 飞天小牛肉 』;,2020/12/29 日开通,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 技术栈等相关原创技术好文。关注公众号第一时间获取文章更新, 后台回复 300 即可免费获取极客大学出品的 Java 面试 300 题
  • 并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已累计 1.8k+ star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~ 😊
  • 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 900+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + … 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中。

Original: https://www.cnblogs.com/cswiki/p/15384346.html
Author: 飞天小牛肉
Title: 三分钟图解事务隔离级别,看一遍就懂

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508070/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 项目要实现多数据源动态切换,咋搞?

    文章首发于公众号:BiggerBoy 原名:编程大道 在做项目的时候,几乎都会用到数据库,很多时候就只连一个数据库,但是有时候我们需要一个项目操作多个数据库,不同的业务功能产生的数…

    数据库 2023年6月11日
    0124
  • 配置 Windows Terminal 步骤

    配置 Windows Terminal 的步骤 前提:在微软商店下载两个软件 Windows Terminal PowerShell oh-my-posh 配置 oh my pos…

    数据库 2023年6月6日
    0131
  • 第八章:变量、常量和基础类型

    本篇翻译自《Practical Go Lessons》 Chapter 8: Variables, constants and basic types 1 你将在本章中学到什么? …

    数据库 2023年6月6日
    0144
  • visual studio 2015 IOS开发连接mac时提示错误couldn’t connect to xxxx, please try again的一个方法

    本人使用虚拟机MAC。原本使用虚拟机中的VS2015连接正常没有问题。 但是当把MAC的虚拟机文件COPY到另一个机器上,提示”couldn’t conne…

    数据库 2023年6月14日
    0101
  • Shell 第二章《流控》

    前言 无论什么编程语言都离不开条件判断(流控)。SHELL也不例外。例如,用户输入的密码不够长时提示用户,你太短了例如,用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目…

    数据库 2023年6月14日
    0106
  • MySQL实战45讲 13

    13 | 为什么表数据删掉一半,表文件大小不变? 一个 InnoDB 表包含两部分,即: 表结构定义和 数据。 在 MySQL 8.0 版本以前, 表结构是存在以.frm 为后缀的…

    数据库 2023年6月16日
    0106
  • 05-ElasticSearch高级搜索

    * package com.coolman.hotel.test; import com.coolman.hotel.pojo.HotelDoc; import com.faste…

    数据库 2023年6月16日
    095
  • ubuntu设置时区

    posted @2022-06-21 08:30 一份人间烟火 阅读(2 ) 评论() 编辑 Original: https://www.cnblogs.com/zcxxcvbn/…

    数据库 2023年6月9日
    0101
  • Java并发编程之CAS

    在Java并发编程的世界里,synchronized 和 Lock 是控制多线程并发环境下对共享资源同步访问的两大手段。其中 Lock 是 JDK 层面的锁机制,是轻量级锁,底层使…

    数据库 2023年6月11日
    082
  • 国行XBoxOne第一次开机配置主要问题备忘

    1,Kinect可以在设置中关闭。 2,彻底关闭主机,需要长按主机上的开关键,将主机彻底关机,同时开机只要轻触一下主机开关机键即可 3,不能更新问题:3.1检查网络已连接3.2检查…

    数据库 2023年6月14日
    0249
  • 一文了解Cookie

    Cookie 什么是 Cookie? 先要了解HTTP是 无状态的Web服务器,什么是无状态呢?一次对话完成后下一次对话完全不知道上一次对话发生了什么。如果在Web服务器中只是用来…

    数据库 2023年6月11日
    0109
  • FastDFS安装和简介详细总结

    1、fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统。 2 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用…

    数据库 2023年6月14日
    0114
  • Windows界面个人常用快捷键

    分享一下个人常用快捷键。 说明:字母排序规则遵循字母表(a->z) 快捷键 介绍 windows+d 由当前应用直接返回桌面,再按一次回到应用 windows+e 打开文件资…

    数据库 2023年6月14日
    0117
  • Elasticsearch搜索引擎的使用

    当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果。 这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而且查询需要在多个字段中进行,使用l…

    数据库 2023年6月14日
    0144
  • Minio的安装与使用

    Minio的安装与使用 一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也…

    数据库 2023年6月6日
    0111
  • 1. SQL

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球