带你深入了解数据库的事务

news2024/11/14 19:24:38

为什么要使用事务

日常开发中,很多操作,不是通过一个SQL就能完成的,往往需要多个SQL配合完成
当执行多个SQL操作的时候,如果中间出现了特殊的情况(程序崩溃,系统奔溃,网络断开,主机掉电了……)可能就会出现前面的SQL执行成功,后面的SQL执行失败了

联系现实: 转账的时候,数据丢失
在这里插入图片描述
解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败
使用事务可以确保数据库中的一组操作要么全部成功,要么全部失败。这样可以保持数据库中的数据一致性。

事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。


事务的四大特性

在这里插入图片描述

原子性❤️❤️

定义:把多个操作,打包成一个整体称为"原子性"

事务,把多个操作,打包成一个整体,能够保证,这个整体要么都执行成功,要么就一个都不执行
从而有效避免,部分执行,部分未执行,产生的一些"中间状态引起的问题"

这里的都不执行不是真的不执行
当事务中的若干个 sql 语句在一条一条的执行的,事务能够保证,当执行到某一条的时候如果出现问题了。
数据库就能够自动的把前面 sql 造成的影响,给恢复回去,恢复如初,看起来就好像一条SQL都没执行的样子。(把这里的“翻新"的操作,称为"回滚" (rollback))

数据库事务的原子性,核心就是通过"回滚"机制来保证的

回滚实现的机制
为了实现回滚机制,数据库会在执行事务的时候,记录日志.
当事务最终都执行完毕,中间没有差错,这些记录的内容就可以不要了,
但是如果执行事务的过程中,出现问题了, mysql就可以根据日志中记录的内容,来进行恢复操作.

  1. 之前进行了新增操作,就把数据删除掉.
  2. 之前进行了删除操作,就把数据新增上来
  3. 之前进行了修改操作,就把数据改回去
  4. 之前是查询操作,不影响,不需要任何恢复行为.

一致性❤️

定义:执行事务之前,和执行事务完毕之后,数据是一致的(不会出现这种"对不上"的情况),是对数据正确的承诺

持久性也是和回滚有关的:
一旦触发回滚了,回滚回去的数据得是对的.
如果顺利执行没有触发回滚,数据也是要符合要求的.

联系现实体会数据一致性的重要性:
每个公司都有专门的会计岗位负责公司的账目,如果账目对不上,会计可能就会进去;
每个月的生活费,自认为没买什么东西,结果却是还没到月底,就没生活费了,剩余的时间就会很难熬,你心中关于生活费的记录和实际记录对不上,也就是数据的不一致


持久性❤️

定义:此处的持久指的是 程序重启/主机重启,数据仍然能存在

执行事务对数据库产生的修改,就会在硬盘上持久保存重启之后仍然存在;
如果存储在内存中,就不是持久的,内存中的数据会随着程序重启/主机重启而消失

至于 mysql 是如何提交后的事务一定会落到硬盘上的,这背后的原理是十分复杂的((#’^.^# say: 你们的博主不会))


隔离性 ❤️❤️❤️

定义:描述的是,数据库并发执行事务时,产生的情况
并发:多个客户端,同时给服务器,发起事务

每个客户端什么时候把事务提交过来?? 是不知道的,
很可能多个客户端正好就把事务赶到一块了,就需要数据库服务器都能给出处理,更糟糕的是,如果这多个事务都尝试操作同一个表,情况就会更复杂。
数据库服务器就需要把这多个事务都能处理好,就类似于一心多用

联系现实来理解
就是一个餐馆,来了好几桌客人,每一桌客人都点了不同的菜,就需要确保每一桌都能够提供正确的服务,也要在正确的前提下,尽可能的提高效率

数据库一个一个处理事务,处理的速度会比较慢,如果要是一起同时处理,又会诞生出新的问题,
由此产生的三个典型问题

  1. 脏读问题:事务B读到了事务A中未提交的临时数据(脏数据) => 解决:写加锁
  2. 不可重复读:事务B读的过程中,又有一个事务C对刚才事务A提交的数据进行了修改,使事务B内部不同的读操作读到的结果不同 => 解决:读加锁
  3. 幻读:和不可重复读类似,事务B读的过程中,事务C没有修改数据内容,而是修改了“结果集",导致B内部不同的读操作读到的结果集合不同 => 解决:串行化

注:关于并发执行事务过程中产生的三个典型问题这部分内容,后面博主会再写一篇博客进行阐述,并把博客链接放在文章末尾。

博主(#^.^#):创作不易,动动你们的小手 点赞,收藏 + 关注哟!😍😍😍

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

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

相关文章

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包:第七:trans_network class

# 网络是研究微生物生态共现模式的常用方法。在这一部分中,我们描述了trans_network类的所有核心内容。 # 网络构建方法可分为基于关联的和非基于关联的两种。有几种方法可以用来计算相关性和显著性。 #我们首先介绍了基于关联的网络。trans_network中的cal_cor参数…

进程的一些概述

文章目录 前言一、进程以及查看指令二、查看进程 前言 进程是什么?进程应该如何描述?进程又该如何管理?进程如何查看? 一、进程以及查看指令 一个正在运行的程序,加载到内存中的程序是进程也叫做任务,用任务资源管理…

从单机到分布式微服务,大文件校验上传的通用解决方案

一、先说结论 本文将结合我的工作实战经历,总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案,形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等,虽然文中使用的编程语言…

在Visual Studio中调试 .NET源代码

前言 在我们日常开发过程中常常会使用到很多其他封装好的第三方类库(NuGet依赖项)或者是.NET框架中自带的库。如果可以设置断点并在NuGet依赖项或框架本身上使用调试器的所有功能,那么我们的源码调试体验和生产效率会得到大大的提升。今天我…

openKylin系统安装ssh服务结合内网穿透实现固定公网地址访问

文章目录 1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接小结 6. 固定SSH公网地址7. SSH固定地址连接 openKylin是中国首个基于Linux 的桌面操作系统开发者平台,通过开放操作系统源代码的方式,打造具有自…

Selenium 自动化 —— Selenium IDE录制、回放、导出Java源码

Hello Selenium 示例 之前我们在专栏的第一篇文章中演示了使用使用Selenium进行百度搜索的Hello world示例。 代码不复杂非常简单: public static void main(String[] args) {WebDriver driver null;try {// 设置Chrome驱动的路径 // System.setPro…

matplotlib库简介及函数说明

目录 简介matplotlib.pyplot as plt 常用函数说明创建子图plt.subplots().plot() 子图参数set_title()axis2.legend()fig.autofmt_xdate() 简介 matplotlib 是一个用于创建二维图表和数据可视化的 Python …

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用 文章目录 【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用参考资料一、初识WebFlux1、什么是函数式编程1)面向对象编程思维 VS 函数式编程思维(封装、继承和多态描述事物间…

【视频异常检测】Delving into CLIP latent space for Video Anomaly Recognition 论文阅读

Delving into CLIP latent space for Video Anomaly Recognition 论文阅读 ABSTRACT1. Introduction2. Related Works3. Proposed approach3.1. Selector model3.2. Temporal Model3.3. Predictions Aggregation3.4. Training 4. Experiments4.1. Experiment Setup4.2. Evaluat…

Linux设置IP地址多种方法保姆级教程,外加修改主机名并通过生成密钥,组建机群。

[引入提问] 怎么设置linux服务器的名称? 方法1: nmtui—自动打开设置机器名称的操作界面---输入即可。重启hostnamed服务, systemctl restart system-hostnamed 方法2: 直接编辑 vim /etc/hostname ,输入新的…

VR历史建筑漫游介绍|虚拟现实体验店加盟|VR设备购买

VR历史建筑漫游是一种利用虚拟现实技术,让用户可以身临其境地参观和探索历史建筑的体验。通过VR头显和相关设备,用户可以在虚拟环境中自由移动和互动,感受历史建筑的真实氛围和文化内涵。 在VR历史建筑漫游中,您可以选择不同的历史…

Vue+SpringBoot打造数据可视化的智慧河南大屏

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏,包含了GDP、…

SpringCloud搭建微服务之Micrometer分布式链路追踪

1. 概述 由于Spring Cloud Sleuth最新版本只支持Spring Boot 2.7.x,核心项目已经迁移到Micrometer Traceing项目,Spring Boot 3.x版本要实现分布式链路追踪需要集成Micrometer。更多详情可以参阅Micrometer官网 本文将以Spring Boot 3.2.x和Spring Clo…

视频私有云,HDMI/AV多硬件设备终端接入,SFU/MCU视频会议交互方案。

在视频业务深入的过程中越来越多的硬件设备接入视频交互的视频会议中远程交互,有的是视频采集,有的是医疗影像等资料,都需要在终端承显,这就需要我们的设备终端能多设备,多协议接入,设备接入如下。 1&#…

Python Web开发记录 Day13:Django part7 Ajax入门与案例(任务管理)

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、Ajax入门①简介②工作原理③优点④缺点⑤使用…

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像(RSI)中的目标检测经常面临一些日益严重的挑战,包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战,要么通过大核卷积…

易基因:人类大脑的单细胞DNA甲基化和3D基因组结构|Science

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 高通通量表观基因组分析技术可用于阐明大脑中细胞复杂性的基因调控程序。5-甲基胞嘧啶 (5mCs)是哺乳动物基因组中最常见的修饰碱基,大多数5mCs发生在胞嘧啶-鸟嘌呤二核苷酸&a…

Spring Boot 实现程序的优雅退出

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 优雅停机是什么 SpringBoot如何实现优雅停机 合理杀死进程 法一&…

企业开展开源安全治理必要性及可行性详细分析

背景 开源软件安全威胁是近几年企业安全面临的主要威胁,也是企业应用安全方向讨论的热门话题,但是由于是新的需求新的方向,很多企业在观望,当前开展这项工作是否已经成熟,项目成功率如何? 当新鲜事物产生时…

【iOS】——Blocks

文章目录 前言一、Blocks概要1.什么是Blocks 二、Block模式1.block语法2.block类型变量3.截获自动变量值4._Block修饰符5.截获的自动变量 三、Blocks的实现1.Block的实质2.截获自动变量值3._Block说明符4.Block存储域 前言 一、Blocks概要 1.什么是Blocks Blocks是C语言的扩…