MySQL-基础篇-事务(事务简介、事务操作、事务的四大特性、并发事务引发的问题、事务的隔离级别)

文章目录

  • 1. 事务简介
  • 2. 事务操作
    • 2.1 未控制事务
    • 2.2 控制事务
      • 2.2.1 查看事务的提交方式
      • 2.2.2 设置事务的提交方式
      • 2.2.3 提交事务
      • 2.2.4 回滚事务
      • 2.2.5 开启事务
      • 2.2.6 完善转账案例
  • 3. 事务的四大特性(ACID)
  • 4. 并发事务引发的问题
  • 5. 事务隔离级别
    • 5.1 演示
      • 5.1.1 Read Uncommitted(RU)
      • 5.1.2 Read Committed(RC)
      • 5.1.3 Repeatable Read(RR)
      • 5.1.4 Serializable
    • 5.2 查看隔离级别
    • 5.3 设置事务隔离级别
    • 5.4 面试题(为什么阿里巴巴会将 MySQL 的事务隔离级别设置为 Read Committed)

1. 事务简介

DBMS:Database Management System,数据库管理系统

事务(Transaction)是数据库管理系统(DBMS)中一个不可分割的工作单位,它由一系列操作组成,这些操作要么全部成功执行,要么全部失败回滚,不会处于中间状态

事务的主要目的是保证数据的一致性和完整性,常见的事务案例就是银行转账


我们先来看一下正常的银行转账业务

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们再来看一下转账异常的情况,如果张三取出钱后,再转账给李四的过程中业务出现了异常,会怎么样呢

如果业务出现了异常,张三的钱扣了,但是李四却没收到钱,出现了数据不一致的情况

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

那怎么解决呢,我们只需要把整个流程都放在一个事务里面,当所有操作都执行完成了之后,再提交事务

在这里插入图片描述

MySQL 的事务默认是自动提交的,也就是说,当执行一条 DML 语句时,MySQL 会立即隐式地提交事务

2. 事务操作

我们先准备一张名为 account 的表,表的结构和表数据如下

create table account
(id    int primary key AUTO_INCREMENT comment 'ID',name  varchar(10) comment '姓名',money double(10, 2) comment '余额'
) comment '账户表';insert into account(name, money)
VALUES ('张三', 2000),('李四', 2000);

在这里插入图片描述

2.1 未控制事务

我们先来测试正常情况

-- 1.查询张三余额
select *
from account
where name = '张三';-- 2.张三的余额减少1000
update account
set money = money - 1000
where name = '张三';-- 3.李四的余额增加1000
update account
set money = money + 1000
where name = '李四';

测试完毕之后检查数据的状态, 可以看到数据操作前后是一致的

在这里插入图片描述


测试异常情况

我们先把数据都恢复到2000, 接着一次性执行以下 SQL 语句

-- 1.查询张三余额
select *
from account
where name = '张三';-- 2.张三的余额减少1000
update account
set money = money - 1000
where name = '张三';出错了....-- 3.李四的余额增加1000
update account
set money = money + 1000
where name = '李四';

由于 出错了.... 这句话 不符合 SQL 语法,执行后会报错

检查最终的数据情况,发现数据在操作前后并不一致

在这里插入图片描述

2.2 控制事务

2.2.1 查看事务的提交方式

SELECT @@autocommit;

2.2.2 设置事务的提交方式

autocommit = 1 表示自动提交

SET @@autocommit = 0;

2.2.3 提交事务

commit;

2.2.4 回滚事务

rollback;

2.2.5 开启事务

start transaction;

2.2.6 完善转账案例

-- 开启事务
start transaction;-- 1.查询张三余额
select *
from account
where name = '张三';-- 2.张三的余额减少1000
update account
set money = money - 1000
where name = '张三';-- 3.李四的余额增加1000
update account
set money = money + 1000
where name = '李四';-- 如果正常执行完毕, 则提交事务
commit;-- 如果执行过程中报错, 则回滚事务
rollback;

3. 事务的四大特性(ACID)

  1. 原子性(Atomicity): 原子性确保事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。事务中任何一个操作失败,整个事务将被回滚,就像事务从未执行过一样
  2. 一致性(Consistency): 一致性确保事务执行的结果是数据库状态的合法状态,即数据库在事务开始和结束时的数据满足预定义的约束条件(如外键约束、唯一性约束等)
  3. 隔离性(Isolation): 隔离性确保并发执行的事务彼此隔离,一个事务的中间状态不会被其他事务所见。这意味着即使在多个事务同时执行时,每个事务都感觉自己是唯一在执行的事务
  4. 持久性(Durability): 持久性确保一旦事务提交,其结果就永久保存在数据库中。即使发生系统故障,如电源故障或系统崩溃,已提交事务的结果也不会丢失,持久性一般是通过将事务的输出写入到持久存储设备(如硬盘)来保证

4. 并发事务引发的问题

  • 赃读:一个事务读到另外一个事务还没有提交的数据
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"

脏读的示例(事务 A 中没提交的数据被事务 B 读取)

在这里插入图片描述

不可重复读的示例(事务 A 在第一步和第三步查询的 id 为 1 的数据不一致)

在这里插入图片描述

幻读的示例

  1. 事务 A 在第一步查询到 id 为 1 的数据不存在
  2. 事务 A 在执行 insert 语句前,事务 B 提交了事务,往表中插入了 id 为 1 的数据
  3. 事务 A 在第二步执行 insert 语句,执行失败,因为破坏了主键的唯一性
  4. 事务 A 在第三步查询到 id 为 1 的数据仍然不存在

在这里插入图片描述

5. 事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别,事务隔离级别主要有以下几种:

在这里插入图片描述

5.1 演示

我们来演示一下,在不同的隔离级别情况下,并发事务可能引发的问题

5.1.1 Read Uncommitted(RU)

脏读(一个事务读到了另一个事务还没有提交的数据)

在这里插入图片描述

5.1.2 Read Committed(RC)

Read Committed 隔离级别虽然解决了脏读问题,但是没有解决不可重复读的问题(一个事务先后读取同一条记录,但两次读取的数据不同)

在这里插入图片描述

5.1.3 Repeatable Read(RR)

Read Committed 隔离级别虽然解决了不可重复读问题,但是没有解决幻读的问题(一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影")

在这里插入图片描述

在这里插入图片描述

5.1.4 Serializable

Read Committed 隔离级别解决了所有并发事务引发的问题

在这里插入图片描述

5.2 查看隔离级别

查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

5.3 设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
  • SESSION 设置的是当前会话(也就是当前连接)的隔离级别
  • GLOBAL 设置的是全局隔离级别

事务隔离级别越高,数据越安全,但是性能越低

示例

SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

5.4 面试题(为什么阿里巴巴会将 MySQL 的事务隔离级别设置为 Read Committed)

既然 MySQL 默认的事务隔离级别是 Repeatable Read,那为什么阿里巴巴会将 MySQL 的事务隔离级别设置为 Read Committed,谈谈你的理解

参考回答:

MySQL 的默认事务隔离级别是REPEATABLE READ,这是一个相对较高的隔离级别,可以防止不可重复读和脏读

阿里巴巴将 MySQL 的事务隔离级别设置为READ COMMITTED,可能是因为以下几个原因:

  1. 性能考虑READ COMMITTED是比REPEATABLE READ低的隔离级别,因此在某些情况下可能会提供更好的性能。特别是在高并发环境下,READ COMMITTED可以减少锁的持有时间,从而提高系统的响应速度和吞吐量
  2. 业务场景:对于阿里巴巴的业务场景来说,幻读可能不是一个大问题,READ COMMITTED足以满足需求,而REPEATABLE READ可能会造成一些不必要的性能开销
  3. 可控的并发问题:阿里巴巴可能有能力管理和控制其系统中的并发问题,即使使用READ COMMITTED。这意味着,阿里巴巴可能可以通过其他手段(如调整应用层逻辑、优化数据库设计和使用合适的索引等)来减少并发问题带来的影响
  4. 避免死锁:降低事务的隔离级别可以减少发生死锁的概率,特别是在频繁进行更新操作的环境中

阿里巴巴将 MySQL 的事务隔离级别设置为READ COMMITTED,可能是基于性能、并发控制、业务需求和故障处理等多方面的考虑,每个公司和组织都应该根据自己的业务场景来决定使用哪个隔离级别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

羊大师:白露养生经,羊奶不可少

随着秋风渐起,白露悄然而至,自然界中的万物开始展现出成熟与收获的喜悦。在这个季节转换的微妙时刻,我们的身体也需要顺应天时,进行一番细致的调养。白露养生,不仅是对自然的敬畏,更是对健康生活的追求。 在…

橘子学ES实战操作之管道类型Ingest pipelines的基本使用

简介 我们在使用ES的时候,经常的用法就是把其他数据源比如Mysql的数据灌到ES中。 借用ES的一些功能来提供数据的全文检索以及聚合分析之类的功能。 在这个灌数据的过程中,我们经常会对数据做一些治理,类似ETL的能力。然后把治理后的数据写入…

SQLite3 数据类型深入全面讲解

SQLite3,作为一款轻量级的数据库管理系统,在数据存储方面展现出了其独特的魅力。它不仅支持标准的SQL语法,还提供了丰富的数据类型供开发者选择。这些数据类型不仅涵盖了基本的数值和文本类型,还包括了日期时间、二进制数据等复杂…

Eclipse 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 打开字体设置页面3. 找到Text Font,点击修改4. 修改字体 前言 Eclipse 自定义字体大小,统一设置为 Courier New ,大小为 三号 具体操作 【Windows】>【Perfer…

三极管的检测方法与经验

中、小功率三极管的检测 1、已知型号和管脚排列的三极管,可按下述方法来判断其性能好坏 a.测量极间电阻。将万用表置于 R100 或 R1k 挡,按照红、黑表笔的六种不同接法进行测试。其中,发射结和集电结的正向电阻值比较低,其他四种…

Mac M1 安装Hadoop教程(安装包安装)

一、引言 前面一期,我分享了通过homebrew方式安装Hadoop,本期我将通过安装包方式介绍下hadoop如何安装。二、下载open jdk8 官方下载地址 注意如果是x86架构的苹果电脑,Architecture选择x86 64-bit或者 x86-32bit。 下载后,将得…

Spark-push-based shuffle

一、上下文 《Spark-Task启动流程》中讲到如果一个Task是一个ShuffleMapTask,那么最后在调用ShuffleWriter写入磁盘后还会判断是否可以启用push-based shuffle机制,下面我们就来继续看看push-based shuffle机制背后都做了什么 二、push-based shuffle机…

python-实战4拆分pdf文件

Wps等软件拆分一份页数较多的PDF文件时,经常会出现要收费或者只能拆分其中几页的情况,下面我们就自己来写代码来实现这个收费功能。 课程中已经初步学习了如何将一个PDF文件拆分成总页数个子PDF文件,我们基于其中的思路进行改进&…

【Unity开发】Blender导入VRM格式注意事项

【背景】 Blender顺利导入了VRM Format插件后,发现有的电脑导入后Mesh,Armature和Texture都一切正常,有的电脑只能导入一个框架。 【分析】 首先检查Blender版本和插件的适配性,4.2版本前后VRM Format有两个不同版本。 Blender…

JVM:浅谈JVM调优策略

多数的Java应用不需要在服务器上进行GC优化,虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。在应用上线之前,先考虑将机器的JVM参数设置到最优(适合)。 在进…

Golang 开发使用 gorm 时打印 SQL 语句

目录 1. 使用 Debug 方法2. 全局设置日志级别3. 自定义 Logger4. 总结 参考 gorm 文档:https://gorm.io/zh_CN/docs/logger.html Gorm 有一个 默认 logger 实现,默认情况下,它会打印慢 SQL 和错误。如果想要全部或部分打印 SQL 的话可以通过设…

基于QT与STM32的电力参数采集系统(华为云IOT)(211)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路【4】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1】设备端开发…

移动UI:成就勋章页面该如何设计,用例子说明。

移动应用的UI成就勋章页面通常是一个展示用户在应用中取得成就和获得勋章的页面。这种页面通常用于激励用户参与应用的活动,增加用户的参与度和忠诚度。 UI设计成就勋章页面时,一般会包括以下元素和功能: 1. 勋章列表: 展示用户…

关于解决输入法自动切换无法正常输入文字,此时鼠标旁边出现蓝色圆圈频闪的问题解决

输入法切换时鼠标旁边出现蓝色圆圈频闪,通常表明有某个后台进程正在频繁运行或某个服务在不断启动或崩溃。这可能是导致输入法频繁切换的根本原因。 第一步:检查和终止异常的后台进程 任务管理器: 打开任务管理器 (Ctrl Shift Esc)。在“…

ubuntu任何版本 卡死 解决办法

首先,我们一定要记得ubuntu一定不要强制关机,一定,一定 因为90% 的可能你的电脑从此就会黑屏开不了机了,然后你就可以按照我的方法去卸载,重装ubuntu系统了。/(ㄒoㄒ)/~~ (如果能解决您的问题&#xff0c…

Codeforces Round 970 (Div. 3) (个人题解)(未补完)

前言: 昨天晚上的比赛,可惜E题太笨了没想到如何解决,不过好在看到F过的多直接跳过去写F了,能过个5个也还不错了,而且一个罚时也没吃。之后的题我还是会再能补的时候补完的噢! 正文: 链接&…

Context-Aware Depth and Pose Estimation for Bronchoscopic Navigation翻译

文章目录 摘要1.引言2. 相关工作3. 方法概述3.1. 基于CT数据的虚拟深度生成3.2. 基于视频帧的上下文感知深度估计3.3. 方法概述3.3.1. 从CT数据生成虚拟深度图3.3.2. 基于上下文感知的深度估计从视频帧中3.3.3. 相机姿态估计通过 2D/3D 配准 4. 实验4.1. 数据集和基线4.2. 实现…

【C++ Primer Plus习题】10.8

问题: 解答: main.cpp #include <iostream> #include "List.h" using namespace std;int main() {Item item 0;List list;cout << "请输入item(0结束):";cin >> item;while (item!0){cin.get();list.add(item);cout << "请…

C4单细胞|国产平台解密睾丸肿瘤细胞“朋友圈”

单细胞&#xff08;核&#xff09;转录组学已成为生命科学研究的基础工具&#xff0c;在疾病、免疫、生命演化、器官结构、发育等领域发挥重要作用&#xff0c;但规模化研究往往是制约单细胞层面研究的重要因素。为了突破单细胞研究门槛高、费用高的瓶颈&#xff0c;凌恩生物重…

CentOS 7 上安装 JDK 8 的步骤:

CentOS 7 上安装 JDK 8 的步骤&#xff1a; 一、下载 JDK 1.可以从 Oracle 官网下载 JDK 8&#xff0c;但需要注册账号。也可以从其他可靠的镜像站点下载。 jdk.java.net http://jdk.java.net/ 2.例如&#xff0c;可以从 Oracle 官网下载 Linux 版本的 JDK 8 压缩包&#x…