【MySQL】事务 详解

事务 详解

  • 一. 为什么使用事务
  • 二. 事务的概念
  • 三. 使用
  • 四. 事务的特性
    • 原子性(Atomicity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)
  • 五. 事务并发所带来的问题
    • 脏读问题
    • 不可重复读
    • 幻(影)读
  • 六. 事务隔离级别

一. 为什么使用事务

假如说你要进行转账, 比如转给 张三 50元,先从你的账户里面扣除 50, 准备给 张三账户 + 50 时,数据库由于种种原因 挂了,没加上,此时 50 元 凭空消失了, 那么这就是一个比较悲伤的故事了,这种事情当然不能发生。

drop table if exists accout;
create table accout(id int primary key auto_increment,name varchar(20) comment '账户名称',money decimal(11,2) comment '金额'
);insert into accout(name, money) values('阿里巴巴', 5000),('四十大盗', 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';

假如执行完第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上没有增加金额。

解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

二. 事务的概念

事务: 指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

事务的目的: 把若干个独立的操作打包成一个整体,这个整体要么全部成功执行, 要么一点都不执行。

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

有时前一个 SQL 是为了给后一个 SQL 提供支持,若后一个 SQL 不执行或者执行出现问题了, 前一个 SQL 也就失去意义了。

三. 使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

start transaction;-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';commit;

四. 事务的特性

ACID
Atomicity: 原子性
Consistency: 一致性
Isolation: 隔离性
Durability: 持久性

原子性(Atomicity)

原子性: 任务不能被再细分,事务要么全部成功执行,要么一点也不执行,不会出现中间状态。

比如上面的转账例子, 不会出现 A账户 -2000, 结果数据库崩了/程序崩了/断电了, B 的账户并没有 + 2000 而导致的中间状态。

原子性如何保证 ?
该执行还得执行, 无法预知失败。
当出现执行失败后,由数据库自动进行一些 “还原” (回滚rollback)工作, 消除前面 已经执行过 的 SQL 带来的影响,使得看起来与没有执行一样。

比如:
当执行第二个 SQL 出现失败时,数据库会还原之前的操作,上一个是 +, 那么就 -, 是 * 就 / 。

数据库如何知道还原成哪个值呢?

日志, 数据库会把执行数据库的每个操作记录下来,整个记录过程搭配了 日志+数据库内置的一些表 来完成。

既然能还原,是不是就可以大胆的删库 了 ?
数据库想要记录详细的操作需要消耗大量的时间和空间,所以这个记录一定不会存储那么久,可能数据库是经过好几年沉淀出来的结果,但是日志只是记录最近几天的,所以还得依赖 权限控制 和 数据备份。

一致性(Consistency)

事务在执行前后,数据库从一个一致的状态转换到另一个一致的状态。这意味着事务必须遵循预定义的规则和约束,以确保数据的完整性。
如果事务违反了任何约束,它将被回滚,数据库不会处于不一致的状态。

隔离性(Isolation)

隔离性指的是多个事务同时运行时,每个事务都应该被视为独立的,不应该受到其他事务的干扰。
这意味着在并发执行的情况下,一个事务的操作不会对其他事务产生影响,直到事务提交为止。
数据库系统使用锁和其他机制来实现隔离性。

持久性(Durability)

持久性确保一旦事务提交成功,其结果将永久保存在数据库中,即使系统发生故障或重启。这意味着事务的结果不会因为系统崩溃而丢失,数据库系统必须将数据持久地写入磁盘或其他持久存储介质中。

总结:
事务的四个特性确保了数据库事务的可靠性和一致性,使得数据库系统能够有效地管理并发操作,同时保护数据免受损坏或丢失。但严格的ACID特性有时会对性能产生一定的开销,因此在某些情况下,可能需要权衡ACID特性与性能之间的关系。

五. 事务并发所带来的问题

并发: 包含并行和广义的并发。

当并发执行多个事务时, 尤其当这多个事务在尝试修改/读取同一份数据时,容易出现一些问题。
事务的隔离级别就是在解决该问题。

脏读问题

事务 A 在对某个数据进行修改,修改的时候,事务 B 读取了这个数据,此时事务 B 读取到的很可能只是一个临时的中间结果,不是最终结果, 那么此时 B 就是读到了 “脏数据”。

出现脏读的原因:
事务和事务之间没有隔离,加上一些限制,就可有效避免脏读。

解决脏读:
给写操作加锁,修改过程中, 不允许别人读, 修改之后才能读(解锁)。
(注意一旦加锁, 事务之间隔离性提高, 并发度降低)

不可重复读

不可重复读问题: 在一个事务中,包含多次读操作,多次读操作读出来的结果不一致

在这里插入图片描述

解决脏读问题时,只是约定写加锁, 写时不能读, 但是 读时还能写,所以还存在不可重复读问题。
这个问题好比:通过码云读代码,读的时候别人修改并提交了,我们刷新一下,代码变了。

解决:
约定读时也加锁,读时不能进行修改操作, 读时,其他事务能读但不能修改。

在这里插入图片描述

事务的隔离性进一步提高,并发性进一步降低

幻(影)读

幻读问题: 一个事务执行过程中进行多次查询,多次查询的结果集不一样,
结果集多了,这是一种特殊的不可重复读问题。

在这里插入图片描述

本例就是读代码时,代码数量变了,本来只有一个 A.java, 后面读取的时候发现又多了 B.java

注意:
幻读出现的场景:

第一:事务的隔离级别为可重复读。

第二:幻读仅专指新插入的行,在范围查询中,后一次查询出现了新的数据行。
(因为数据库中原本没有这个数据,当然就无法加锁了,所以会出现新的数据, 而因为读时不能写,所以不会删除数据)。

解决:
彻底串行化,读的时候不要写任何代码。
(但是在MySQL的InnoDB引擎中,通过间隙锁(gap lock)+行锁组成的next-key lock,在可重复读级别下解决了幻读的问题。参考链接:前阿里数据库专家总结的MySQL里的各种锁(下篇))

串行化,隔离级别最高,并发度最低(其实已经串行化,没有并发了),数据最可靠,但是执行速度最慢。

所以,并发性和隔离性不可兼得。
可根据实际需要调整数据库隔离级别,通过不同的隔离级别,控制事务间的隔离性和并发程度。

六. 事务隔离级别

在这里插入图片描述

(MySQL 默认隔离级别为 repeatable read, 通过修改 my.ini 文件可以设置当前隔离级别。)

好啦 ! 以上就是对 MySQL 事务的讲解, 希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

MT4移动端应用指南:随时随地进行交易

如今,随着科技的不断发展,我们可以随时随地通过手机进行各种操作,包括进行金融交易。本文将为大家介绍一款优秀的金融交易软件——MT4(可在mtw.so/6gwPno这点下)移动端应用,并提供详细的使用指南&#xff0…

ubuntu 20.04 设置 authorized_keys 让 VS Code ssh 远程免密连接

相关文章 VSCode SSH 连接远程ubuntu Linux 主机 前言 前面记录了 VS Code 可以通过 SSH 远程连接 ubuntu Linux 主机,比如代码放在远程 ubuntu 主机上, windows 端 VS Code 通过 ssh 远程连接 ubuntu,并打开 远程主机上的 代码 如果不设置…

Linux命令之文件管理

Linux命令之文件管理 创建文件删除文件移动文件拷贝文件查看文件文件统计信息的查看文件内容的查看文件的权限文件权限的介绍和表示文件权限的改变 文件的类型 查找文件 创建文件 创建文件的话,一般使用touch命令 touch file1(文件名字)删除文件 删除文件的话&…

如何将枯燥的大数据进行可视化处理?

在数字时代,大数据已经成为商业、科学、政府和日常生活中不可或缺的一部分。然而,大数据本身往往是枯燥的、难以理解的数字和文字,如果没有有效的方式将其可视化,就会错失其中的宝贵信息。以下是一些方法,可以将枯燥的…

ubuntu server 更改时区:上海

1. 打开终端,在命令行中以超级用户或具有sudo权限的用户身份运行以下命令: sudo dpkg-reconfigure tzdata 这会打开一个对话框,用于选择系统的时区设置。 2. 在对话框中,使用上下箭头键在地区列表中选择"Asia"&#x…

打造基于终端命令行的IDE,Termux配置Vim C++开发环境

Termux配置Vim C开发环境,打造基于终端命令行的IDE 主要利用VimCoc插件,配置C的代码提示等功能。 Termux换源 打开termux,输入termux-change-repo 找到mirrors.tuna.tsinghua.edu.cn,清华源,空格选中,回…

手写Spring:第5章-注入属性和依赖对象

文章目录 一、目标:注入属性和依赖对象二、设计:注入属性和依赖对象三、实现:注入属性和依赖对象3.0 引入依赖3.1 工程结构3.2 注入属性和依赖对象类图3.3 定义属性值和属性集合3.3.1 定义属性值3.3.2 定义属性集合 3.4 Bean定义补全3.5 Bean…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…

深度优先搜索(dfs)--矩阵部分-leetcode以及常见题

介绍 深度优先搜索(Depth-First Search,DFS)是一种常用的图搜索算法,它用于查找图或树数据结构中的路径或解决问题。下面是深度优先搜索的常见步骤以及一个示例问题: 深度优先搜索的常见步骤: 选择起始节…

Layui快速入门之第一节Layui的基本使用

目录 一:Layui的基本概念 二:Layui使用的基本步骤 1.在官网下载layui的基本文件,引入css和js文件 ①:普通方式引入 ②:第三方 CDN 方式引入 2.在script标签体中编写代码 3.测试 一:Layui的基本概念 …

flink学习之广播流与合流操作demo

广播流是什么? 将一条数据广播到所有的节点。使用 dataStream.broadCast() 广播流使用场景? 一般用于动态加载配置项。比如lol,每天不断有人再投诉举报,客服根本忙不过来,腾讯内部做了一个判断,只有vip3…

Hadoop的第二个核心组件:MapReduce框架第四节

Hadoop的第二个核心组件:MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程:详细的工作流程第一步:提交MR作业资源第二步:运行M…