什么是事务隔离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 什么是事务隔离

什么是事务隔离



事务简单的来说是保证一组数据库操作,要么全部成功,要么全部失败。

MySQL 中事务支持是在引擎实现的, MySQL 原生的 MyISAM 引擎不支持事务,这也是 MyISAM 被 InnoDB 引擎取代的重要原因。


隔离性与隔离级别


提到事务, 数据库为了保证事务,必须具备四个特性:ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)


事务的四个特性


  • 原子性 (Atomicity)

事务操作,要么全部做完,要么全部不做,不可能停止在中间环节。

  • 一致性 (Consistency)

事务将数据库从一种状态变成另外一种状态。事务开始前和结束后,数据的完整性约束没有破坏。

  • 隔离性(Isolation)

要求每个事物的对象对其他事务的操作对象相互隔离,即该事务提交前对其他事务不可见。多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行的效果。

  • 持久性 (Durability)

事务一旦提交,其结果是永久的,即使发生宕机故障,数据也能够恢复,事务对数据库所有更新将被保存到数据库,不能回滚。


事务的隔离级别


  • READ UNCOMMITTED (读未提交)

一个事务读取了两位一个事务未提交的数据,叫做脏读


例子

  1. 准备两个终端,在此命名为 mysql 终端 1 和 mysql 终端 2,再准备一张测试表 test ,写入一条测试数据并调整隔离级别为 READ UNCOMMITTED ,任意一个终端执行即可。


SET @@session.transaction_isolation = 'READ-UNCOMMITTED';
create database test;
use test;
create table test(id int primary key);
insert into test(id) values(1);
  1. 登录 mysql 终端 1,开启一个事务,将 ID 为 1 的记录更新为 2


begin;
update test set id = 2 where id = 1;
select * from test; -- 此时看到一条ID为2的记录
  1. 登录 mysql 终端 2,开启一个事务后查看表中的数据。


use test;
begin;
select * from test; -- 此时看到一条 ID 为 2 的记录

最后一步读取到了 mysql 终端 1 中未提交的事务(没有 commit 提交动作),即产生了 脏读 ,大部分业务场景都不允许脏读出现,但是此隔离级别下数据库的并发是最好的。

  • READ COMMITTED (读提交) 一个事务可以读取另外一个已提交的事务,多次读取会造成不一样的结果,此现象称为不可重复读问题。Oralce 和 SQL Server 的默认隔离级别。


实例

  1. 准备两个终端,在此命名为 mysql 终端 1 和 mysql 终端 2,再准备一张测试表 test ,写入一条测试数据并调整隔离级别为 READ COMMITTED ,任意一个终端执行即可


SET @@session.transaction_isolation = 'READ-COMMITTED';
create database test;
use test;
create table test(id int primary key);
insert into test(id) values(1);
  1. 登录 mysql 终端 1,开启一个事务,将 ID 为 1 的记录更新为 2 ,并确认记录数变更过来。


begin;
update test set id = 2 where id = 1;
select * from test; -- 此时看到一条记录为 2
  1. 登录 mysql 终端 2,开启一个事务后,查看表中的数据。


use test;
begin;
select * from test; -- 此时看一条 ID 为 1 的记录
  1. 登录 mysql 终端 1,提交事务。


commit;
  1. 切换到 mysql 终端 2。


select * from test; -- 此时看到一条 ID 为 2 的记录


mysql 终端 2 在开启了一个事务之后,在第一次读取 test 表(此时 mysql 终端 1 的事务还未提交)时 ID 为 1 ,在第二次读取 test 表(此时 mysql 终端 1 的事务已经提交)时 ID 已经变为 2 ,说明在此隔离级别下已经读取到已提交的事务。

  • REPEATABLE READ(可重复读)

这个是 MySQL 默认的隔离级别,在同一个事务里,select 的结果是事务开始时间点的状态,因此,同样的 select 操作读到的结果会是一致的,但是会有幻读现象。MySQL 的InnoDB 引擎采用的是 next-key locks 机制来避免幻读。

  1. 准备两个终端,在此命名为 mysql 终端 1 和 mysql 终端 2,准备一张测试表 test 并调整隔离级别为 REPEATABLE READ ,任意一个终端执行即可。


SET @@session.transaction_isolation = 'REPEATABLE-READ';
create database test;
use test;
create table test(id int primary key,name varchar(20));
  1. 登录 mysql 终端 1,开启一个事务。


begin;
select * from test; -- 无记录
  1. 登录 mysql 终端 2,开启一个事务。


begin;
select * from test; -- 无记录
  1. 切换到 mysql 终端 1,增加一条记录并提交。
insert into test(id,name) values(1,'a');
commit;
  1. 切换到 msyql 终端 2。
select * from test; --此时查询还是无记录


通过这一步可以证明,在该隔离级别下已经读取不到别的已提交的事务,如果想看到 mysql 终端 1 提交的事务,在 mysql 终端 2 将当前事务提交后再次查询就可以读取到 mysql 终端 1 提交的事务。我们接着实验,看看在该隔离级别下是否会存在别的问题。

  1. 此时接着在 mysql 终端 2 插入一条数据。


insert into test(id,name) values(1,'b'); -- 此时报主键冲突的错误

在第 5 步没有数据,为什么在这里会报错呢?其实这就是该隔离级别下可能产生的问题,MySQL 称之为 幻读 。注意我在这里强调的是 MySQL 数据库,Oracle 数据库对于幻读的定义可能有所不同。


  • SERIALIZABLE (序列化)

在该隔离级别下事务都是串行顺序执行的,MySQL 数据库的 InnoDB 引擎会给读操作隐式加一把读共享锁,从而避免了脏读、不可重读复读和幻读问题。

  1. 准备两个终端,在此命名为 mysql 终端 1 和 mysql 终端 2,分别登入 mysql,准备一张测试表 test 并调整隔离级别为 SERIALIZABLE ,任意一个终端执行即可。


SET @@session.transaction_isolation = 'SERIALIZABLE';
create database test;
use test;
create table test(id int primary key);
  1. 登录 mysql 终端 1,开启一个事务,并写入一条数据。


begin;
insert into test(id) values(1);
  1. 登录 mysql 终端 2,开启一个事务。


begin;
select * from test; -- 此时会一直卡住
  1. 立马切换到 mysql 终端 1,提交事务。


commit;

一旦事务提交,msyql 终端 2 会立马返回 ID 为 1 的记录,否则会一直卡住,直到超时,其中超时参数是由 innodb_lock_wait_timeout 控制。由于每条 select 语句都会加锁,所以该隔离级别的数据库并发能力最弱。


事务隔离级别

隔离级别 脏读 不可重复读 幻读
读未提交 可以出现 可以出现 可以出现
读提交 不允许出现 可以出现 可以出现
可重复读 不允许出现 不允许出现 可以出现
序列化 不允许出现 不允许出现 不允许出现

快照 在 MVCC 里是怎么工作的?


InnoDB 里面每个事务都有一个唯一的事务 ID,叫做 transaction ID ,事务开启时,InnoDB 获取一个事务ID。

数据表中的一行记录其实有多个版本(row) ,每个版本有自己的 row trx_id。

640.png


图中的三个虚线箭头,就是 Undo log;V1 V2 V3 并不是真实物理存在的,而是每次需要的时候通过当前版本+undo log 计算出来的,比如 V2 的时候,通过V4 和 U3 U2 计算出来的。


Read View


UndoLog 是保存了历史快照,Read View  是帮助判断当前版本的数据是否可见。

InnoDB里面每个事务有一个唯一的事务ID, 叫作transaction id。它是在事务开始的时候向 InnoDB的事务系统申请的,是按申请顺序严格递增的

每行数据有多个版本,每次事务更新数据时,都会生产一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务ID, 记录为 row trx_id。

InnoDB为每个事务构造了一个数组, 用来保存这个事务启动瞬间, 当前正在“活 跃”的所有事务ID。“活跃”指的就是,启动了但还没提交

数组里面事务ID的最小值记为低水位,当前系统里面已经创建过的事务ID的最大值加1记为高水位。

640.png


对于当前事务的启动瞬间来说, 一个数据版本的row trx_id, 有以下几种可能:

  1. 如果落在绿色部分, 表示这个版本是已提交的事务或者是当前事务自己生成的, 这个数据是可见的;
  2. 如果落在红色部分, 表示这个版本是由将来启动的事务生成的, 是肯定不可见的;
  3. 如果落在黄色部分, 那就包括两种情况
  • 若 row trx_id在数组中,表示这个版本是由还没提交的事务生成的,不可见;
  • 若 row trx_id不在数组中,表示这个版本是已经提交了的事务生成的,可见。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
11天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
448 192
|
3天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
9天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
5天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
315 195

热门文章

最新文章