MySQL事务

article/2025/6/21 7:17:02

事务(Transaction)是数据库管理系统中一组操作的集合,作为一个单元要么全部成功,要么全部失败,确保数据的一致性和完整性。它像一个“原子操作单元”,遵循ACID原则(原子性、一致性、隔离性、持久性)。

特性

  • 原子性(Atomicity)

    • 事务是最小工作单元,不可再分。事务中的操作要么全部执行成功,要么全部不执行(回滚)。
    • 确保操作的“不可分割”。
  • 一致性(Consistency)

    • 数据库总是从一个一致的状态转换成另一个一致状态,不会因为某条语句失败而出现其他状态。事务完成后,数据库必须保持一致的状态(符合所有约束、规则)。
    • 不会产生不合法的数据。
  • 隔离性(Isolation)

    • 多个事务并发执行时,彼此之间的操作互不干扰,表现为独立状态。通常来说,一个事务所做的修改在最终提交前,对其他事务是不可见的。

    • 通过锁机制实现。

  • 持久性(Durability)

    • 事务一旦提交,其结果对数据库是永久的,即使系统崩溃也不会丢失。

一个兼容 ACID 的数据库系统很多复杂但可能用户并没有觉察到的工作。 相比没有实现 ACID 的数据库,通常会需要更强的 CPU 处理能力、更大的内存和更多的磁盘空间。

事务的基本操作(SQL命令)

  • begin /start transaction
    开始一个新事务。

  • commit
    提交事务,应用所有操作的变化,结束事务。

  • rollback
    回滚事务,将操作状态恢复到开始前的状态。

  • savepoint / release savepoint / rollback to savepoint
    保存点:在事务中设定“中间点”,可以回滚到某个保存点。

流程示意

begin;                -- 开始事务
-- 执行一系列操作
update account set balance = balance - 100 where id=1;
update account set balance = balance + 100 where id=2;-- 根据条件决定
if success thencommit;             -- 提交事务
elserollback;           -- 回滚事务
end if;

使用事务

  • 开始标志:任何一条 DML 语句的执行
  • 结束标志:
    • 提交:成功的结束,将所有的DML语句操作记录和底层硬盘文件中数据进行同步
    • 回滚:失败的结束:将所有 DML 语句操作记录全部清除

MySQL 默认是自动提交

#开启事务
start transaction;
#结束事务
end transaction;
#提交事务
commit;
#保存回滚点
savepoint 回滚点名;
#回滚事务
rollback[ to 回滚点名];#查看事务的提交方式
show variables like 'autocommit';
#启用和关闭自动提交模式
set autocommited=1;
set autocommited=0;

:转账业务

drop table if exists account;
create table account
(id int primary key auto_increment,name varchar(20),money int
);
insert into account(name, money)
values("lz", 20000),("xz", 500);
  • 自动提交和手动提交,再开一个 MySQL-Front 窗口查看数据变化
    • MySQL默认会在每个SQL语句执行完后,自动提交事务(数据变更立即生效)。
    • 关闭自动提交:通过调整设置,可以让事务变成“手动提交”,即你写入操作后,需要明确调用commit来提交,否则更改不会生效。
#执行语句,再打开一个 MySQL-Front窗口,查询是否有变化
update account set money=money-1000 where name="lz";
update account set money=money+1000 where name="xz";
select * from account;#查看提交方式,改为手动提交
# 查看当前autocommit(自动提交)设置的状态(值是ON或OFF)。
show variables like 'autocommit';
set autocommit=off;
#手动提交
commit;

隔离级别(控制事务间的干扰)

  • 读未提交(Read Uncommitted):事务可以读取未提交的变更,可能会出现脏读。这个级别会导致很多问题,性能也没有好太多,一般很少使用。

  • 读已提交(Read Committed):只能读取已提交的数据,防止脏读,但可能出现不可重复读。

  • 可重复读(Repeatable Read):在事务期间多次读取相同数据结果一致,避免不可重复读。该级别无法解决幻读问题。该级别是 MySQL 的默认隔离级别,并且 MySQL 在该级别就可以很大程度解决幻读问题。

  • 串行化(Serializable):强制事务串行执行,避免幻读问题。该级别会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题。实际很少用这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。

在这里插入图片描述

  • 查看隔离级别:
#查看会话级的当前隔离级别:(会话级只对当前窗口有效)
select  @@tx_isolation;
select @@session.tx_isolation;
#查看全局级的当前隔离级别: 
select @@global.tx_isolation;
  • 设置隔离级别
    • 方法1:my.ini 文件中的 [mysqld] 下面添加transaction-isolation=隔离级别
    • 方法2:通过命令
#设置全局或当前会话范围
set global transaction isolation level 隔离级别;# 全局
set session transaction isolation level 隔离级别;# 当前
  • 不同隔离级别下a1、a2、a3的值为多少?
    • 未提交读:2、2、2
    • 提交读:1、2、2
    • 可重复读:1、1、2(可能出现幻读)
    • 串行化:1、1、2

在这里插入图片描述

  • 实现隔离级别的两种方法:
    • 加锁:读数据前对其加锁,阻止其他事务对数据修改
    • 快照:读取数据的快照(之前的版本)实现,例如,可重复读级别在整个事务期间都读取事务开始时的快照去解决不可重复读问题。

并行事务带来的问题

并行事务指的是在数据库中同时执行的多个事务,它们在时间上交叠进行,但相互之间是并发处理的。

  • 数据一致性问题:
    • 脏读(dirty read):一个事务读到另一个事务未提交的数据就叫做脏读。一个事务对一条记录做修改,在这个事务提交前是有可能随时回滚的,这些数据就是脏数据。
    • 不可重复读(non-repeatable read):在一个事务内多次读取同一条记录,前后结果不一样就叫做不可重复读。事务 A 多次查询同一行数据,在多次查询中间,事务 B 对该行数据进行了修改,事务 A 多次查询同一行的数据就会不一致。
    • 幻读(phantom read):在一个事务内按相同条件多次查询,前后结果集的数量不同就叫做幻读。事务 A 按 id>5 的条件进行多次查询,在多次查询中间,事务 B 插入了一条 id 为6的数据,事务 A 多次查询的结果集数量就会不同。
  • 影响:
    • 脏读:读到其他事务未提交的数据
    • 不可重复读:前后读取数据不一致
    • 幻读:前后读取的结果集数量不同

http://www.hkcw.cn/article/fOLMjGAthl.shtml

相关文章

C# 反射与特性:深入探索运行时类型系统与元数据编程

在C#开发中,我们通常编写静态类型的代码——编译器在编译时就知道所有类型信息。然而,.NET框架提供了一套强大的机制,允许我们在运行时检查、发现和使用类型信息,这就是反射(Reflection)。而与反射密切相关的另一项技术是特性(Att…

腾讯面试手撕题:返回行递增有序矩阵第k小的元素

题目 给定一个n行n列的矩阵,这个矩阵的每一行是递增有序的,求这个矩阵中第k小的元素。 解答 优解 基于二分查找和按行统计小于等于目标值的元素个数。算法的时间复杂度为,其中D是矩阵中元素值域的范围(即最大值与最小值的差&a…

【PostgreSQL 02】PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来

PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来 关键词 PostgreSQL高级数据类型, JSONB, 数组类型, PostGIS, 地理信息系统, NoSQL, 文档数据库, 空间数据, 数据库设计, PostgreSQL扩展 摘要 PostgreSQL的高级数据类型是其区别于传统关系数据库的核心…

[Windows] 剪映 视频编辑处理

附链接:夸克网盘分享(点击蓝色字体自行保存下载)

NW994NX734美光固态闪存NX737NX740

NW994NX734美光固态闪存NX737NX740 在数字化浪潮汹涌澎湃的今天,数据存储技术如同一座坚实的基石,支撑着科技世界的大厦。美光固态闪存以其卓越的性能和创新的技术,在存储领域占据着重要的地位。本文将深入剖析NW994、NX734、NX737以及NX740…

C# 类和继承(使用基类的引用)

使用基类的引用 派生类的实例由基类的实例和派生类新增的成员组成。派生类的引用指向整个类对象,包括 基类部分。 如果有一个派生类对象的引用,就可以获取该对象基类部分的引用(使用类型转换运算符把 该引用转换为基类类型)。类…

VMvare 创建虚拟机 安装CentOS7,配置静态IP地址

创建虚拟机 安装CentOS7 设置网络模式 设置静态ip vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network

python:PyMOL 能处理 *.pdb 文件吗?

PyMOL 完全可以打开并处理 PDB(Protein Data Bank)文件,这是 PyMOL 最主要的功能之一。PDB 格式是结构生物学领域的标准文件格式,专门用于存储生物大分子(如蛋白质、核酸)的三维结构数据。 在 PyMOL 中打开…

【数据治理】要点整理-信息技术数据质量评价指标-GB/T36344-2018

导读:指标为数据质量评估提供了一套系统化、标准化的框架,涵盖规范性、完整性、准确性、一致性、时效性、可访问性六大核心指标,助力组织提升数据处理效率、支持决策制定及业务流程优化,确保数据在数据生存周期各阶段的质量可控。…

【Redis】hash 类型

hash 一. hash 类型介绍二. hash 命令hset、hgethexists、hdelhkeys、hvals、hgetallhmset、hmgethlen、hstrlen、hsetnxhincrby、hincrbyfloat 三. hash 命令小结四. hash 内部编码方式五. hash 的应用场景缓存功能缓存方式对比 一. hash 类型介绍 哈希表在日常开发中&#x…

ubuntu/windows系统下如何让.desktop/.exe文件 在开机的时候自动运行

目录 1,​​让 .desktop 文件在 Ubuntu 开机时自动启动​ 1.1 创建 autostart 目录(如果不存在)​ ​ 1.2 将 .desktop 文件复制到 autostart 目录​ ​ 1.3 确保 .desktop 文件有可执行权限​ 2,windows 2.1 打开「启动」文件夹​…

1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集

引言 在嵌入式系统中,通信总线是连接 CPU 与外设的桥梁。从 I2C、SPI 到 UART,每种总线都有其独特的应用场景。而本文要介绍的1-Wire 一线式总线,以其极简的硬件设计和独特的通信协议,在温度采集、身份识别等领域大放异彩。本文将…

有机黑鸡蛋与普通鸡蛋:差异剖析与选购指南

在我们的日常饮食结构里,鸡蛋始终占据着不可或缺的位置,是人们获取营养的重要来源。如今,市场上鸡蛋种类丰富,除了常见的普通鸡蛋,有机黑鸡蛋也逐渐崭露头角,其价格通常略高于普通鸡蛋。这两者究竟存在哪些…

Fastapi 学习使用

Fastapi 学习使用 Fastapi 可以用来快速搭建 Web 应用来进行接口的搭建。 参考文章:https://blog.csdn.net/liudadaxuexi/article/details/141062582 参考文章:https://blog.csdn.net/jcgeneral/article/details/146505880 参考文章:http…

数字化转型进阶:精读41页华为数字化转型实践【附全文阅读】

该文档聚焦华为数字化转型实践,核心内容如下: 转型本质与目标:数字化转型是通过数字技术穿透业务,实现物理世界与数字世界的融合,目标是支撑主业成功、提升体验与效率、探索模式创新。华为以 “平台 服务” 为核心&am…

共享内存-systemV

01. 共享内存简述 共享内存是一个允许多个进程直接访问同一块物理内存区域的进程通信工具,因其本身不涉及用户态与核心态之间转换,故效率最佳。为了使用一个共享内存段,一般需要以下几个步骤: 调用shmget()创建一个新共享内存段…

大语言模型值ollama使用(1)

ollama为本地调用大语言模型提供了便捷的方式。下面列举如何在windows系统中快捷调用ollama。 winR打开运行框,输入cmd 1、输入ollama list 显示已下载模型 2、输入ollama pull llama3 下载llama3模型 3、 输入 ollama run llama3 运行模型 4、其他 ollama li…

【基础算法】高精度(加、减、乘、除)

文章目录 什么是高精度1. 高精度加法解题思路代码实现 2. 高精度减法解题思路代码实现 3. 高精度乘法解题思路代码实现 4. 高精度除法 (高精度 / 低精度)解题思路代码实现 什么是高精度 我们平时使用加减乘除的时候都是直接使用 - * / 这些符号,前提是进行运算的数…

uni-data-picker级联选择器、fastadmin后端api

记录一个部门及部门人员选择的功能,效果如下: 组件用到了uni-ui的级联选择uni-data-picker 开发文档:uni-app官网 组件要求的数据格式如下: 后端使用的是fastadmin,需要用到fastadmin自带的tree类生成部门树 &#x…

MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)

性能监控 性能指标 在实现性能监控前,先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系,旨在帮助开发者量化和优化网页在实际用户终端上的性能体验。Web Vitals 强调“以用户为中心”的度量,而…