事务及事务的隔离级别

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 事务及事务的隔离级别

什么是事务

简单来说事务就是一组数据库操作要么全部成功,要么全部失败。Mysql的事务实现是在引擎层实现的。MyISAM 引擎不支持事务。

事务的隔离级别

提到事务,一定绕不开ACID,即:原子性、一致性、隔离性、持久性。今天聊聊事务的隔离性。

为什么要有隔离性?换句话说,隔离性解决了什么问题?当数据库里有多个事务同时执行的时候,可能出现:脏读、不可重复读、幻读的问题,后面会详细介绍。为了解决这些问题,就有了隔离级别的概念。**

SQL标准的隔离级别包括

  1. 读未提交,指的是,一个事务还没提交,它的修改就能被别的事务看到。
  2. 读提交,指的是,一个事务提交后,它的修改才能被别的事务看到。
  3. 可重复读,指的是,一个事务执行过程中看到是数据,总是跟事务启动时看到的数据一致。
  4. 串行化,指的是,读加读锁,写加写锁。当出现读写冲突时,只有等前面事务执行完成,后面的事务才能继续执行。

举个例子:

创建一个表t,只有一个字段c,并插入一行记录:

mysql> create table t(c int) engine=InnoDB;
insert into t(c) values(1);

我们来看看,在不同的隔离级别下,事务A查询的V1、V2、V3分别是多少:

  • 读未提交,事务A可以看到事务B未提交的修改,所以:V1、V2、V3的值都是2;
  • 读提交,事务B的修改在,提交后才能被事务A看到,所以V1=1,v2=v3=2;
  • 可重复读,事务A看到的结果跟启动时看到的结果一致,v1=v2=1,之后事务A提交,在查询v3的时候,此时事务B的更新能看到,所以v3=2;
  • 串行化,事务启动加读锁,之后因为读锁是共享的,所以事务B可以查询得到1,之后的修改操作,需要加写锁,读写锁互斥,所以修改等待,直到事务A提交释放读锁,事务B才能更新。所以,v1=v2=1,v3=2。

事务隔离级别的实现

理解了事务的隔离级别,我们再来看,事务的隔离级别是如何实现的,下面展开说明“可重复读”的实现。

在Mysql中,实际上每条记录在更新的时候都会在回滚日志(undo log)中记录一条回滚操作。记录的最新值加上回滚段,就可以得到前一个状态的值。

假设一个值从1被顺序更新为2、3、4,在回滚日志里就会有类似下面的记录

不同时刻启动的事务,有不同的视图,也就是说,一条记录在系统中可能有多个版本存在,这就是数据库的多版本并发控制(MVCC)。对于视图A来说,想要得到1,必须将当前值4,依次执行所有的回滚操作。

回滚日志的删除逻辑:系统判断当前系统里没有被这个回滚日志更早的视图的时候,就会删除该回滚日志。

尽量少使用长事务,因为长事务意味着系统里会存在很老的视图,为了保存这些回滚日志,浪费空间。长事务除了对回滚段的影响,也会占用锁资源,导致可能拖垮整个库。

事务控制语句

  • START TRANSACTION | BEGIN // 显示开启事务
  • COMMIT // 提交事务,并使得已对数据库做的所有修改持久化
  • ROLLBACK // 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改

笔记参考于极客时间《MySQL实战45讲》


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 数据库
事务的隔离级别有哪些
【10月更文挑战第17天】事务的隔离级别有哪些
|
26天前
事务的隔离级别
在高并发情况下,并发事务会产生脏读、不可重复读、幻读问题,这时需要用隔离级别来控制 读未提交: 允许一个事务读取另一个事务已提交的数据,可能出现不可重复读,幻读。 读提交: 只允许事务读取另一个事务没有提交的数据可能出现不可重复读,幻读。 可重复读: 确保同一字段多次读取结果一致,可能出现幻读。 可串行化: 所有事务逐次执行,没有并发问题。
|
5月前
|
SQL Oracle 关系型数据库
第7章 事务
第7章 事务
31 0
|
7月前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
58 0
|
7月前
|
SQL 前端开发 大数据
什么是大事务?以及大事务产生的问题
什么是大事务?以及大事务产生的问题
202 0
|
存储 Oracle 固态存储
深入理解事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑执行单元。即事务中的所有读写是一个执行的整体,整 个事务要么成功(提交)、要么失败(中止 或者 回滚)。如果失败,应用程序可以安全地重试。
16446 0
深入理解事务
|
算法 关系型数据库 MySQL
事务的隔离级别和对应的问题
事务的隔离级别和对应的问题
|
SQL 存储 关系型数据库
|
SQL Java 大数据
事务详解(2)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
172 1
|
Oracle 安全 Java
事务详解(1)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
113 2