当前位置: 首页 > news >正文

【MySQL篇】事务的认识以及四大特性

何为事务? 

事务(Transaction)是指一组操作的集合,这些操作要么全部执行成功,要么全部不执行。事务通常用于保证数据库的一致性、完整性和可靠性,确保数据的完整性与正确性。

有效避免部分执行,部分未执行而引起的问题;

引入例子:

假设以下场景: 转账
第一步A用户转账给B用户100元 账户-100

-- 从账户A扣款
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

第二步B用户收到A转账100元 账户+100

-- 向账户B存款
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

此时如果第一步完成之后,由于受到各种原因,例网络波动,主机关机,MySQL服务器崩溃等等因素,导致第二步未操作,这可损失大了,A凭空丢失100,所以这种情况是不允许发生的。

此时由于是俩个操作,所有MySQL会将这俩个操作打包成一个操作(原子性),要么一起完成,要么都不完成。

如果中途发生异常,此时操作将会进行“回滚”操作,所有操作将会被撤销。

补充:MySQL会将每一步操作都会记录在MySQL的日志中,所以可以根据日志里面的内容进行还原操作

在 MySQL 中,事务是由多个 SQL 语句组成的一个操作单元,要么所有的操作都成功执行(提交,commit),要么在发生错误时,所有操作都不执行(回滚,rollback)。通过事务,MySQL 能够提供更强的错误恢复能力,并保证数据库在并发访问时的一致性。 


事务的四大特性:

 事务有四个核心特性,通常被称为 ACID 特性:原子性(Atomicity),一致性(Consistency),持久性(Durability),隔离性(Isolation);

原子性:

在上述操作中,将多个操作打包成一个操作时,此时代表这个操作具有“原子”的,原子就是以前最小的单位,不可拆分。

事务中的操作要么全部成功,要么全部失败。原子性确保了事务是最小的执行单位,无法再分割。即使在事务执行的过程中发生故障,数据库也会通过回滚操作使事务的状态恢复到事务开始之前。


 一致性:

在执行事务开始前后,要保证数据是一致的,不会出现对不上的情况。一旦触发“回滚”操作,也要保证回滚回去的数据跟原来一样;

事务执行前后,数据库的状态必须从一个一致的状态转变到另一个一致的状态。所有事务都必须遵循数据库的完整性约束,如主键、外键等,确保数据的完整性和准确性。


持久性:

一旦事务提交,它对数据库的更改是永久性的,即使发生系统崩溃或断电,提交的事务所做的更改也会保留下来。


隔离性:

在并发环境下,多个客户端同时对服务器发起事务请求,一个事务的执行不应受到其他事务的干扰。每个事务应该像是在独占数据库一样执行,直到它提交或回滚。

在并发环境下,可能会产生以下问题:脏读,不可重复读,幻读;


脏读:

脏读指的是一个事务读取了另一个事务尚未提交的数据。这可能会导致读取到不一致的数据,因为另一个事务可能回滚,使得当前事务读取的数据变得无效。

例子:
假设有一场随堂考试,小明(学渣)抄袭小强(学霸)的试卷(这种行为是不好的,只是比喻),此时小强写完了试卷给小明抄,小明写着写着写完了之后,小明就直接提交试卷了。但小强在检查试卷的时候,发现检查试卷的时候很多答案填错了,那么小强肯定将答案改正了回来
 ,而小明吃了大亏,心里想我*****,还不如自己写...................

核心在于:当小强不仅写完试卷,并且还检查完毕,确保不会修改的情况下,小明再去抄写他的答案,不然都可能出错

 解法方法:

当事务B查看事务A(写操作)的数据时候,将事务A的数据进行“加锁”,此时事务B不能查看A的数据,必须等待事务A确定下来,才可以查看。
这就相当于降低了 '并发能力',也就降低了数据库服务器的处理效率,提高了 '隔离性' ,也提高了数据的准确性。在并发执行事务过程中,相互之间是互相影响的,彼此的影响越小,隔离性越高;反之影响越大,隔离性越低。


不可重复读

在上述基础上,我们已经把写操作加上锁,这就意味着读操作的事务不能中途查询,以免没有查询到最终结果。

例子:
当我们写博客的时候,此时读者必须等我们发布完成之后,才能阅读我们的博客。

假设我们写完已经发布了  这是事务A

然后读者去查看博客的内容  这是事务B

当我们发布完 我们还觉得内容需要修改一下 可能存在一点问题 又进行发布了 这是事务C

问题出现在事务B此时在读数据的时候,此时我们事务C也执行了,假设博客页面刷新了,事务B发现此时读到的数据跟刚才读到的数据不一样,这就是不可重复读问题;

解法:

在事务B读操作的时候 ,我们也不能执行事务C,必须等事务B执行完之后,才能修改数据,也就是说在“读数据”的时候也不能“写数据”;

所以对事务B读操作也加上“锁”,就可以保证事务 B 前后两次读取的数据都是一致的。

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

  • 脏读关注的是一个事务读取另一个事务未提交的数据,且这个数据可能最终会被回滚,因此它是不可靠的。
  • 不可重复读关注的是同一个事务内,在多次读取同一数据时,数据发生了变化(通常是由于其他事务的提交),导致读取结果不一致。

幻读: 

幻读是指一个事务在查询数据时,其他事务可能插入、删除或修改记录,导致该事务查询的数据集发生变化,即查询结果出现"幻象"。在一个事务中,查询的结果集在不同的查询操作之间可能不一致。

例子:

刚才约定对读和写操作进行加上锁。

事务A发布第一篇博客

事务B在查询博客的内容

此时我们并不修改第一篇博客的内容,闲着也是闲着,于是我们继续写了新的一篇博客,第二篇博客。 事务C

在B再一次查询的时候,发现了多出来了一篇博客,此时就是幻读。

解法:

当读者在阅读博客的时候,叫我们啥事别做了,好好休息,简单来说,就是一个事务一个事务来,在执行事务的时候,不要执行任何操作;

实现串行化操作,此时没有并发了,因此效率最低,并且也是隔离性最高的,数据是最准确的。


隔离性的隔离级别:

隔离级别脏读不可重复读幻读适用场景
读未提交(Read Uncommitted)高并发、无需完全一致性的数据场景
读已提交(Read Committed)适用于实时性要求较高的场景
可重复读(Repeatable Read)适用于大部分应用,默认隔离级别
串行化(Serializable)保证最大程度的一致性,但性能最低

总结

  • 脏读不可重复读幻读都是由于并发事务互相干扰所导致的问题。为了避免这些问题,可以选择合适的事务隔离级别:
    • 读未提交:出现脏读,不可重复读,幻读。
    • 读已提交:防止脏读,但可能会出现不可重复读和幻读。
    • 可重复读:防止脏读和不可重复读,但可能会出现幻读。
    • 串行化:完全避免所有并发问题,但性能最差。

相关文章:

【MySQL篇】事务的认识以及四大特性

何为事务? 事务(Transaction)是指一组操作的集合,这些操作要么全部执行成功,要么全部不执行。事务通常用于保证数据库的一致性、完整性和可靠性,确保数据的完整性与正确性。 有效避免部分执行&#xff0…...

Windows 11 安装 Dify 完整指南 非docker环境

# Windows 11 安装 Dify 完整指南## 前置要求- Python 3.11 - Node.js 18 - PostgreSQL 14 - Redis for Windows - Git - Ollama (可选,用于本地模型)## 详细安装步骤### 1. 安装必要软件1. **Python 3.11**- 从 https://www.python.org/downloads/release/python-…...

电子电气架构 --- 什么是EPS?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…...

12寸半导体厂等保安全的设计思路

等级保护(等保)二级和三级的主要区别在于安全要求的严格程度、所需部署的安全措施和设备、以及对安全事件响应和处理的能力。以下是等保二级和三级之间的一些关键区别: 一、 安全要求严格程度: - 等保二级:适用于需要较高安全保护的信息系统,要求能够防范轻微的恶意攻击…...

【Chrome Extension】一、CSDN计时扩展设计

【Chrome Extension】一、CSDN计时扩展设计 重点内容内容脚本 content_scripts 文件目录1、整体目录2、manifest.json3、scripts/content.js4、css/content.css 重点内容 内容脚本 content_scripts 1、manifest.json文件配置 {"manifest_version": 3, # *依赖Chro…...

C语言——数据在内存中的存储

目录 前言 一数据类型 类型归类 二整形在内存中的存储 原反补码 大小端 相关练习题 三浮点数在内存中的储存 浮点数储存规则 前言 只有取学习数据在内存中的存储,我们在以后才能定义好(用好)各种类型的数据! 一数据类型…...

Python(二)str、list、tuple、dict、set

string name abcdefprint(name[0]) #a # 切片:取部分数据 print(name[0:3]) # 取 下标为0,1,2的字符 abc print(name[2:]) # 取 下标为2开始到最后的字符 cdef print(name…...

如何在谷歌浏览器中设置邮件客户端

在日常生活和工作中,电子邮件已经成为不可或缺的沟通工具。对于使用谷歌浏览器的用户来说,将Chrome设置为默认邮件客户端可以带来诸多便利。本文将详细介绍如何在谷歌浏览器中设置邮件客户端,帮助大家轻松实现这一目标。 在谷歌浏览器中设置邮…...

Robot Framework搭建自动化测试框架

1.配置环境 需要安装jdk8,andrid sdk(安装adb),pycharm编译环境以及软件 安装Robot Framework 首先,你需要安装Robot Framework,可以使用 pip 进行安装: pip install robotframework安装所需的…...

Linux——字符设备驱动控制LED

目录 驱动模块的加载和卸载 驱动程序Makefile编写 字符设备注册与注销 字符设备驱动模板 应用程序对驱动读写操作 iounmap函数 LED寄存器物理地址映射到虚拟地址 应用程序代码编写 Linux驱动的两种运行方式: 1、将驱动编译进Linux内核中,也就是zIm…...

云边端架构的优势是什么?面临哪些挑战?

一、云边端架构的优势 降低网络延迟:在传统集中式架构中,数据需传输到云计算中心处理,导致网络延迟较高。而云边端架构将计算和存储推向边缘设备,可在离用户更近的地方处理数据,大大降低了网络延迟,提升了用…...

Effective C++ 条款 01:视 C++ 为一个语言联邦

文章目录 条款 01:视 C 为一个语言联邦关键点 条款 01:视 C 为一个语言联邦 C 是一个复杂而多样化的编程语言,可以将其视为由多个子语言(sublanguage)组成的联邦。为了更好地理解和使用 C,需要认识它的四个…...

Redis分布式锁释放锁是否必须用lua脚本?

无lua脚本释放锁: public void unlock(String key, String uniqueValue) {String value redisDao.getString(key);if (value ! null && value.equals(uniqueValue))redisDao.delete(key); }使用lua脚本释放锁: // LUA脚本 -> 分布式锁解锁原…...

JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…...

数据中心虚拟化与高可用性架构实施指南

数据中心虚拟化与高可用性架构实施指南 项目背景 随着业务的不断扩展和技术的迭代更新,公司决定采用虚拟化技术和构建高可用性架构来提高数据中心的资源利用率和业务连续性。本项目旨在详细描述运维人员在实施数据中心虚拟化和高可用性架构过程中的关键步骤和任务…...

对文件内的文件名生成目录,方便查阅

import os import re# 定义要查找的目录路径 path r"J:\...\顺序目录" # 要遍历的主目录路径# 定义输出的目录文件路径 output_file r"J:\...\目录_中文文件.txt" # 保存结果的文件路径# 判断文件名是否包含中文字符 def contains_chinese(text):retur…...

leetcode hot100 轮转数组

189. 轮转数组 已解答 中等 相关标签 相关企业 提示 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮…...

定位方式:css

使用相对路径 div ul #div下的所有ul,空格表示相对路径(这个实际中用的多一些) 绝对路径-一般不用绝对路径 html>head>div,“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…...

谷歌浏览器的网络连接问题解决方案

在数字化时代,网络浏览器已成为日常工作和生活中不可或缺的工具。谷歌浏览器以其快速、稳定和丰富的功能深受用户喜爱。然而,就像其他软件一样,谷歌浏览器也可能遇到网络连接问题,这可能由多种因素引起。本文将为您提供一系列解决…...

保护模式基本概念

CPU 架构 RISC(Reduced Instruction Set Computer) 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的(如ARM是32位的指令)、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…...

LeetCode 最长回文子串:python 题解写

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

从春晚到AWE:追觅与扫地机器人市场的“冰与火之歌”

2026年开年,扫地机器人行业呈现出耐人寻味的两极图景:一边是追觅凭借春晚效应交出全渠道市占第一的成绩单,另一边是洛图科技发布的行业数据显示,1-2月中国扫地机器人线上销量同比下降22.2%。在行业大盘承压的背景下,追觅为何能逆势增长?春晚这个国民级舞台,究竟如何改写…...

Qwen3.5-千问 ZGC在Linux和Windows实现有何区别?

ZGC 在 Linux 和 Windows 上的核心算法(如着色指针、读屏障、并发标记/重定位)是完全一致的,但在底层操作系统接口调用、内存映射实现细节以及平台支持成熟度上存在显著差异。 以下是 ZGC 在 Linux 和 Windows 实现上的主要区别对比&#xff…...

IEEE/ASME Transactions on Mechatronics | 院士团队让移动机器人在复杂环境中学会主动避障

论文信息 英文题目: Vector Field Augmented Reinforcement Learning for Adaptive Motion Planning of Mobile Robots 中文题目:面向移动机器人自适应运动规划的向量场增强强化学习 作者: Yang Lu, Weijia Yao, Cong Li, Yongqian Xia…...

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅竟

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

higress 这个中登才是AI时代的心头好峭

核心摘要:这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景,告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”,并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...

基于组件化架构的Bilibili-Evolved性能优化实战:实现60fps流畅播放与40%内存占用降低

基于组件化架构的Bilibili-Evolved性能优化实战:实现60fps流畅播放与40%内存占用降低 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved作为一款强大的哔哩哔哩增强…...

嵌入式Linux开发常见问题解决:内核编译与NFS根文件系统启动卡住

在移植Linux系统到ARM开发板的过程中,编译内核和通过NFS启动根文件系统是两个常见环节,但也经常遇到各种“小坑”。本文结合两个实际案例,分析问题原因并给出解决方案。一、编译内核时出现 lzop: not found 错误问题现象在执行 make zImage 编…...

Docker 容器中运行 AI CLI 工具:用户隔离与持久化卷实战指南暗

环境安装 pip install keystone-engine capstone unicorn 这3个工具用法极其简单,下面通过示例来演示其用法。 Keystone 示例 from keystone import * CODE b"INC ECX; ADD EDX, ECX" try:ks Ks(KS_ARCH_X86, KS_MODE_64)encoding, count ks.asm(CODE)…...

贾子哲学(Kucius Philosophy):跨文化智慧重构与AI时代的文明觉醒

贾子哲学(Kucius Philosophy):跨文化智慧重构与AI时代的文明觉醒摘要: 贾子哲学由贾龙栋(笔名贾子)于2025-2026年提出,融合东西方智慧,以“智慧三定律”区分智能与智慧,以…...