【MySQL】数据库事务详解

news2025/2/24 15:27:14

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.coloradmin.cn/o/1866283.html

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

相关文章

【Text2SQL 论文】MCS-SQL:利用多样 prompts + 多项选择来做 Text2SQL

论文:MCS-SQL: Leveraging Multiple Prompts and Multiple-Choice Selection For Text-to-SQL Generation ⭐⭐⭐ arXiv:2405.07467 一、论文速读 已有研究指出,在使用 LLM 使用 ICL 时,ICL 的 few-shot exemplars 的内容、呈现顺序都会敏感…

Apple - View Programming Guide

本文翻译整理自:View Programming Guide(更新:2013-08-08 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaViewsGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002978-CH1-SW1 文章目录…

Java学习笔记(多线程):CompetableFuture

本文是自己的学习笔记,主要参考资料如下 https://www.cnblogs.com/dolphin0520/p/3920407.html JavaSE文档 https://blog.csdn.net/ThinkWon/article/details/102508721 1、Overview2、重要参数3、主要方法3.1、创建实例,获取返回值3.2、线程执行顺序相关…

基于Springboot+Vue的校友社交系统(带1w+文档)

基于SpringbootVue的校友社交系统(带1w文档) 校友社交系统作为一种典型的管理系统也迅速的发展并深入人们的日常生活中,它使用户足不出户就可以管理自己的校友社交信息等,最大化减缩了用户的管理时间,提高了管理效率。 项目简介 基于SSMVUE的…

【TB作品】MSP430G2553,单片机,口袋板, 烘箱温度控制器

题3 烘箱温度控制器 设计一个基于MSP430的温度控制器,满足如下技术指标: (1)1KW 电炉加热,最度温度为110℃ (2)恒温箱温度可设定,温度控制误差≦2℃ (3)实时显…

llm-universe | 四. 构建RAG应用

构建RAG应用 一.将LLM 接入 LangChain二.构建检索问答链1.加载向量数据库2.创建一个 LLM3.构建检索问答链4.检索问答链效果测试5.添加历史对话的记忆功能5.1 记忆(Memory)5.2 对话检索链(ConversationalRetrievalChain) 三. 部署知…

【论文阅读】-- Temporal Summary Images:通过交互式注释生成和放置实现叙事可视化的方法

Temporal Summary Images: An Approach to Narrative Visualization via Interactive Annotation Generation and Placement 摘要1 引言2 背景及相关工作2.1 叙事可视化和讲故事2.2 显示面向时间的数据2.3 小倍数和漫画2.4 注释可视化 3 设计要求和工作流程3.1 工作流程3.2 TSI…

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入,将所有的输入按照字符串进行处理,并返回一个字符串,input()函数的…

C3P0数据库连接池

目录 一:连接池介绍 1.1连接池解决的问题 2.常用的数据库连接池 二:c3p0介绍 2.1C3P0介绍: 2.2C3P0快速入门 1.常用参数说明 2.API介绍 3.使用步骤 1.导入jar包c3p0-0.9.1.2.jar 2.编写c3p0-config.xml配置文件,配置对…

统信UOS上鼠标右键菜单中添加自定义内容

原文链接:统信UOS上鼠标右键菜单中添加自定义内容 Hello,大家好啊!今天给大家带来一篇关于在统信UOS桌面操作系统上鼠标右键菜单中添加自定义内容的文章。通过自定义鼠标右键菜单,可以大大提升日常操作的效率和便捷性。本文将详细…

KVM网络模式设置

一、KVM网络模式介绍 1、NAT ( 默认上网 ) 虚拟机利用host机器的ip进行上网,对外显示一个ip;virbr0是KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供NAT访问外网的功能,默认ip为192.168.122.1 2、自带的Bridge 将虚拟机桥接到host机器的网卡上,vm和ho…

SOA和ESB介绍

SOA(面向服务的架构) 面向服务的架构(Service-Oriented Architecture,SOA)是一种设计理念,用于构建松耦合的、可互操作的、模块化的服务。在SOA架构中,应用程序被划分为一系列的服务&#xff0c…

202485读书笔记|《我还有一片风景要完成》——溪水急着要流向海洋 浪潮却渴望重回土地 弱水长流,我只能尽一瓢饮,世界大千,我只能作一瞬观

202485读书笔记|《我还有一片风景要完成》——溪水急着要流向海洋 浪潮却渴望重回土地 弱水长流,我只能尽一瓢饮,世界大千,我只能作一瞬观 《华语散文温柔的一支笔:张晓风作品集(共5册)》张晓风&#xff0c…

分享一个微信管理工具

聚合管理多个微信号 1、聚合聊天 支持多微信账号消息,在统一端口接收回复 2、话题素材库 可提前把话题准备好用到的时候一键发送 3、朋友圈互动 支持在聊天窗口直接看到当前客户朋友圈实时点赞评论互动 批量多号添加好友 1、批量添加联系人,导入联系…

C#基于SkiaSharp实现印章管理(2)

上一篇文章最后提到基于System.Text.Json能够序列化SKColor对象,但是反序列化时却无法解析本地json数据。换成Newtonsoft.Json进行序列化和反序列化也是类似的问题。   通过百度及查看微软的帮助文档,上述情况下需自定义转换类以处理SKColor类型数据的…

java的字节符输出流基类、File Writer类和Buffered Writer类

一、字节符输出流基类:Writer 1.属于抽象类 2.常用方法 二、字节符输出流Flie Writer类 1.是writer类的子类 2.以字符为数据处理单元向文本文件中写数据 3.示例 4.实现步骤 三、BufferedWriter类 1.是Writer类的子类。 2.带有缓冲区 默认情况下&#xff0c…

游戏AI的创造思路-技术基础-深度学习(6)

让人工智障具备信念吧,依莫拉萨~~~串频道暴露年龄。。。不过深度信念和信念真的没啥关系,不知道为啥这样起名 目录 3.6. 深度信念网络(DBN) 3.6.1. 定义 3.6.2. 发展历史 3.6.3. 算法公式 3.6.4. 运行原理 3.6.4.1. 基本原理 3.6.4.2. Python实现…

Spring统一功能

文章目录 一、什么是统一功能二、拦截器2.1 什么是拦截器2.2 拦截器的使用2.3 案例:不拦截前端的请求2.4 拦截器是如何实现的 ---- >分析DispatcherServlet源码分析 三、适配器模式四、统一数据返回格式五、统一异常六、案例:在图书管理系统使用统一功…

重大进展!微信支付收款码全场景接入银联网络

据中国银联6月19日消息,近日,银联网络迎来微信支付收款码场景的全面接入,推动条码支付互联互通取得新进展,为境内外广大消费者提供更多支付选择、更好支付体验。 2024年6月,伴随微信支付经营收款码的开放,微…

【low-ui-vue】实现原生可扩展动态表格组件

本文字数:3520字 预计阅读时间:20分钟 所谓动态列的表格,就是列数不固定。像广为使用的elementUI的table组件就是表头写死的,这种也叫列数固定的表格。 01 效果 当然,动态性增加了,当然要做出一定“牺牲”。…