【MySQL】数据库事务详解

img

文章目录

  • 前言
  • 1. 事务的定义
  • 2. 事务的四个特性
    • 2.1 原子性
    • 2.2 一致性
    • 2.3 隔离性
    • 2.4 持久性
  • 3. 事务的并发问题
    • 3.1 脏读
    • 3.2 不可重复读
    • 3.3 幻读
    • 3.4 更新丢失
  • 4. 事务的隔离级别
  • 5. 事务的使用
  • 结语


前言

假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱,我们就需要操作数据库,先扣除 A 账户 100 块钱, 再给 B 账户添加 100 块钱,这样才实现转账成功。但如果我们在扣除的过程中,服务器突然宕机了,那不就乱套了吗,A 发现自己钱少了,但 B 又没有收到钱。此时就需要事务来帮忙了


1. 事务的定义

事务指的是由一个或者多个数据库操作单元组成,相当于把多个 sql 语句打包成一个整体,这个整体就叫做事务,执行的时候,要么全部成功,要么全部失败,不可能存在部分执行成功部分执行失败的情况

这就是为什么事务能解决我们上面所遇到的转账失败场景:我们可以把整个转账过程所需要的 sql 语句组成一个事务,不会存在扣除 A 的账户上的钱而 B 账户的钱也没增加的情况了

那事务是怎么做到 “要么全部成功,要么全部失败” 的呢?究其内部原理,我们可以知道,当事务执行失败时,也就是在执行事务内部的 sql 语句时,数据库发现错误,那它就会自动还原成事务之前的状态,撤销之前的 sql,这样的机制也叫做 “回滚”(rollback)

为了实现回滚,数据库管理系统会记录事务的所有操作到日志中。如果需要回滚,系统会根据日志中的记录撤销操作,将数据库状态恢复到事务开始之前的状态


2. 事务的四个特性

事务的四个特性通常被称为ACID属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),它们共同确保了事务的可靠性和数据的一致性


2.1 原子性

原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何操作失败,整个事务将被回滚,将数据库状态恢复到事务开始之前的状态(最重要的特性)


2.2 一致性

一致性(Consistency):在事务开始之前和事务结束之后,数据库都必须处于一致的状态,即所有的数据都符合数据库的规则和约束


2.3 隔离性

隔离性(Isolation)并发执行的事务之间不会互相影响。每个事务都应该像在独立运行一样,即使多个事务同时进行,它们也应该彼此隔离,以避免数据不一致的问题


2.4 持久性

持久性(Durability):一旦事务被提交,它对数据库的改变就是永久性的。即使系统发生故障,已经提交的事务的结果也不会丢失

不同的数据库管理系统可能会根据ACID属性的不同实现方式,提供不同的性能和一致性保证


3. 事务的并发问题

在数据库系统中,当多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到的一系列并发问题,下面就让我来一一介绍它们


3.1 脏读

脏读(Dirty Read)一个事务读取了另一个事务未提交的更改。如果那个事务最终回滚,那么读取的数据就是无效的

举个例子:现在有两个事务 T1 和 T2 并发执行,其中 T1 在针对某个表的数据进行修改,T1 在执行的过程中,T2 也去读这个表的数据,当 T2 读完后,T1 回滚了,这就导致 T2 读到的数据不是最终的“正确数据”,而是读到了临时的”脏数据“


3.2 不可重复读

不可重复读(Non-repeatable Read):当一个事务重新执行相同的查询,但是得到不同的结果,这是由于另一个事务在两次查询之间修改了数据并提交了更改

举个例子:现在有两个事务 T1 和 T2,T2 对某个表进行查询,得到第一次查询结果,T1 对该表的数据进行了修改,之后 T2 再次对表进行相同查询,但得到的查询结果和第一次不一样,这就是不可重复读


3.3 幻读

幻读(Phantom Read):当一个事务重新执行相同的查询,但是得到不同的数据集合(比如不同的行数),这通常是因为另一个事务插入或删除了一些行

举个例子:现在有两个事务 T1 和 T2,T1 在表中读取了一个字段,然后 T2 在同一个表中新增或者删除了一些数据,T1 再次读取该表时,就会发现多出或者少了几行数据,数据集不一样


3.4 更新丢失

更新丢失(Lost Update):两个或多个事务读取同一数据项,基于这个数据进行计算并尝试更新,如果这些更新几乎同时发生,一个事务的更新可能会覆盖另一个事务的更新


不可重复读和幻读的区别:

  • 不可重复读关注的是单个数据项的更改
  • 幻读关注的是数据集合整体的变化
  • 两者都是由于其他事务的介入导致的读取结果不一致,但不可重复读更侧重于单个数据项的层面,而幻读更侧重于数据的集合层面

4. 事务的隔离级别

因为在多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到上面的脏读、不可重复读、幻读、更新丢失等问题,所以 MySQL 中提供了四种隔离级别来解决并发问题,它们按照提供的隔离保护从弱到强

  1. 读未提交(READ UNCOMMITTED):一个事务可以读取另一个事务未提交的数据,会出现脏读、不可重复读、幻读
  2. 读已提交(READ COMMITTED):一个事务只能读取另一个事务提交之后的数据,即给写操作加共享锁,但会出现不可重复读、幻读
  3. 可重复读(REPEATABLE READ):事务在整个过程中可以重复读取到相同的数据行,即给写操作和读操作都加锁,但会出现幻读
  4. 串行化(SERIALIZABILITY):事务将依次顺序执行,就像它们在一个没有并发的环境中一样,可以防止所有并发问题,包括脏读、不可重复读和幻读
隔离级别脏读不可重复读幻读
读未提交
读已提交X
可重复读XX
串行化XXX

从一到四的隔离级别,它们的事务隔离性逐渐增强,并行程度逐渐减弱,执行速度也逐渐减慢。在 MySQL 中,默认的隔离级别是可重复读


5. 事务的使用

-- 开启事务
start transaction;-- 执行多条 SQL 语句-- 回滚或者提交(rollback 是全部失败,commit 是全部成功)
rollback / commit;

要注意:回滚机制是针对事务这一操作,我们不能把 drop database 这种危险操作也回滚回来


结语

事务保障了数据库的数据完整性和一致性,而且还能通过隔离级别来处理并发问题,同时它也支持我们进行更加复杂的业务需求,掌握事务对我们来说十分有必要,本篇博客中对于事务的具体操作介绍还不够详细,之后博主会更加深入地学习事务,再进行补充

希望大家能够喜欢本篇博客,有总结不到位的地方还请多多谅解。若有纰漏,希望大佬们能够在私信或评论区指正,博主会及时改正,共同进步!

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

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

相关文章

高效修复机床导轨磨损,保障加工精度!

机床导轨是支承和引导运动构件沿着一定轨迹运动的传动装置,在机器设备中是个十分重要的部件,在机床中是常见的部件。机床的加工精度与导轨精度有直接的联系,且导轨一旦损坏,维修较复杂且困难。我们简单总结了以下几点对于机床导轨…

【会议征稿,IEEE出版】第三届机器人、人工智能与智能控制国际会议(RAIIC 2024,7月5-7)

第三届机器人、人工智能与智能控制国际会议(RAIIC 2024)将于2024年7月5-7日中国绵阳举行。 RAIIC 2024是汇聚业界和学术界的顶级论坛,会议将邀请国内外著名专家就以传播机器人、人工智能与智能控制领域的技术进步、研究成果和应用做专题报告…

网站推广如何做?这七个方法要知道

在出海独立站商家中,推广是必不可少的环节。在你完成网站的搭建,产品的上架,以及网站的运营和优化后,你就可以开始着手推广你的网站了。你的网站是承载你的品牌和产品的主要平台,因此,你需要根据你的品牌和…

OZON跨境卖家爆款产品有哪些

OZON跨境卖家爆款产品有哪些?国内的Ozon跨境卖家做这几个品,不爆都难! Top1 太阳镜 Очки солнцезащитные 商品id:1556874194 月销量:1095 OZON跨境卖家爆款产品工具:D。DDqbt。COm/…

2024三掌柜赠书活动第二十五期:Rust 游戏开发实战

目录 目录 前言 Rust语言概念 关于《Rust 游戏开发实战》 Rust系统编程的核心点 Rust开发的关键技术和工具 内容简介 作者简介 书中前言/序言 内容介绍 《Rust 游戏开发实战》全书速览 图书目录 结束语 前言 技术圈最近的编程语言新秀当属Rust莫属,Rus…

Ubuntu下包管理命令dpkg安装deb软件包的示例与汇总

一、选定待安装的deb软件包: 二、dpkg安装chrome浏览器的示例: 三、汇总dpkg包管理命令格式:

高三学生的倒计时 给高考一个倒计时 让学习更有计划的进行

高三学生的压力是很大的,时间也是很紧迫,仅仅一年的时间,许多人都觉得不够用,为了让学子们更有时间紧迫感,更清晰的掌握时间,我们需要一个准确提醒的倒计时效果。 把这个倒计时放到班级电脑上,是…

【人工智能】—基于线性回归和多项式回归模型预测人均收入的研究

引言 随着人工智能技术的飞速发展,机器学习已成为数据分析和预测领域的重要工具。在众多机器学习算法中,线性回归和多项式回归因其模型简单、易于理解和实现而受到广泛应用。本文旨在探讨如何利用这两种回归模型对人均收入进行预测。线性回归模型以其简…

探索顺序结构:栈的实现方式

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ​​ 一、栈的定义 栈(Stack&#xf…

(四十三)Vue Router之嵌套路由

文章目录 什么是嵌套路由嵌套路由的使用demo 上一篇:(四十二)Vue之路由及其基本使用Vue Router 下一篇:(四十四)Vue Router的命名路由和路由组件传参 什么是嵌套路由 实际生活中的应用界面,有…

服务器部署与DDOS攻防

知识点:DHPC与Web服务部署,DHCPig攻防,SYN Flooding测试 DHCP: 能够自动为客户机获取IP等参数 DHCP是动态主机配置协议(Dynamic Host Configuration Protocol)的缩写,它是一种网络管理协议&am…

935.骑士拨号器 - 力扣

935.骑士拨号器 - 力扣 题目链接:935. 骑士拨号器 - 力扣(LeetCode) 题目: 示例 1: 输入:n 1 输出:10 解释:我们需要拨一个长度为1的数字,所以把骑士放在10个单元格中…

Spring AI 调用 openAI 进行语音朗读(文本转语音,TTS)

项目搭建: 参考 Spring AI 介绍以及与 Spring Boot 项目整合 编写 Controller 接口 创建一个 Controller 类,例如 TranscriptionController。在该类中,注入 Resource。编写一个接口,例如 //,用于处理语音转录请求。…

多接口分线盒在工业自动化中的重要性与应用

简介 多接口分线盒是现代工业自动化中不可或缺的一个组成部分,它主要用于简化复杂的接线系统,提高效率和可靠性。本文将详细探讨多接口分线盒的定义、功能、以及在工业自动化中的应用情况。 无源多接口分线盒 多接口分线盒的定义与功能 多接口分线盒是…

嵌入式工程师从0开始,到底该学什么,怎么学

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!嵌入式是个大筐&#xff0…

基于springboot实现宠物商城网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现宠物商城网站管理系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,商品信息因为其管理内容繁杂&#xff…

Windows Nginx更新版本

一、准备新版安装包 nginx: downloadhttps://nginx.org/en/download.html 二、升级Nginx 1、备份原Nginx 2、上传新版Nginx 上传并解压 3、更新版本 1)原文件夹更新 1.关闭nginx 查看原版本号 nginx -v 命今关闭 nginx -s stop 确认进程里没有nginx&#…

【每日刷题】Day76

【每日刷题】Day76 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 561. 数组拆分 - 力扣(LeetCode) 2. 删除有序链表中重复的元素-II_牛客题霸…

论文学习_基于导向式模糊测试的二进制程序漏洞验证方法

1. 引言 研究背景及现存问题:基于代码相似性比较的漏洞检测方法属于静态分析方法,不可避免地存在误报率高的问题,对静态检测方法得到的疑似漏洞代码进行人工分析存在工作量大, 效率低的问题。解决该问题的有效的方案之一是使用导向式模糊测试方法,生成能够执行到疑似漏洞…