MySQL 事务的 ACID 特性与应用

news2024/11/18 9:20:14

MySQL事务的ACID特性与应用

数据库事务 是保障数据一致性和完整性的关键机制。事务不仅是并发控制的核心,更是数据恢复的基本单位。本文将带你深入了解MySQL中的事务概念、ACID特性以及如何在实际应用中正确处理事务。

1. 什么是事务?

事务(Transaction) 是用户定义的一系列数据库操作序列,这些操作要么全部成功,要么全部失败。事务是一个不可分割的工作单位。

举例说明:银行转账

假设你要从账户A 转账10000元到账户B。这个转账操作可以定义为一个事务,包含以下两个步骤:

  1. A账户减少10000元: A = A - 10000
  2. B账户增加10000元: B = B + 10000

如果这两个操作中的任何一个失败,那么整个事务就会回滚,确保A账户的钱不会丢失

2. 事务的ACID特性

事务具有四个重要特性,统称为ACID

2.1 原子性(Atomicity)

原子性 保证了事务中的所有操作要么全部完成,要么全部不做。这是事务的最基本属性。

2.2 一致性(Consistency)

一致性 是指事务执行前后,数据库都必须处于一致性状态。换句话说,事务必须将数据库从一个有效状态 转换到另一个有效状态

2.3 隔离性(Isolation)

隔离性 保证了并发执行的事务不会互相干扰。一个事务的中间状态对其他事务是不可见的,直到该事务提交

2.4 持续性(Durability)

持续性 确保了事务一旦提交,其对数据库的修改将永久保存,即使系统崩溃也不会丢失数据。

3. 在MySQL中处理事务

MySQL中的事务处理分为隐式划分显式划分 两种方式。

3.1 隐式划分

在MySQL中,默认情况下AUTOCOMMIT 变量设置为 1,即自动提交模式。这意味着每一条修改语句都被视为一个事务,执行后立即提交。

示例: 在自动提交模式下,执行 UPDATE 语句后,修改立即生效,无需显式提交。

3.2 显式划分

当将 AUTOCOMMIT 设置为 0 时,MySQL不再自动提交事务,你需要手动控制事务的开始和结束。

  • 开始事务: 使用 START TRANSACTION 语句显式开始一个事务。
  • 提交事务: 使用 COMMIT 语句提交所有操作,将数据永久保存到磁盘。
  • 回滚事务: 使用 ROLLBACK 语句撤销所有操作,回到事务开始时的状态。

注意: MySQL中只有InnoDBBDB 存储引擎支持事务,其他存储引擎如MyISAM 不支持事务。

4. 如何提交事务

当事务正常结束后,使用 COMMIT 语句提交事务的所有操作,将其写入物理数据库。

示例:事务提交前后的数据变化

  1. 在root用户下修改数据:
SET autocommit=0;
UPDATE Department SET office='C202' WHERE dno='D1';
SELECT * FROM Department:

image

  1. 在提交前查看数据:
SELECT * FROM Department;

image

此时修改结果仅保存在内存中,其他会话无法看到变化。

  1. 提交事务:
COMMIT;
  1. 在其他会话中查看提交后的数据:
SELECT * FROM Department;

image

此时,其他用户可以看到 D1 学院的办公地点已经更新为 C202

5. 如何撤销事务

使用 ROLLBACK 语句可以撤销事务的所有操作,回到事务开始时的状态。

示例:插入、修改并回滚

  1. 开始事务并插入新记录:
START TRANSACTION;
INSERT INTO Department VALUES ('D6', '文学院', 'D206', '成立于1982年');
  1. 修改新记录:
UPDATE Department SET office='E201' WHERE dno='D6';
  1. 回滚事务:
ROLLBACK;
  1. 查看回滚后的数据:
SELECT * FROM Department;

此时,D6 的所有操作都被撤销。

6. 保存点与回滚

在复杂的事务中,可以使用保存点(SAVEPOINT) 将事务划分为多个部分。当出现问题时,可以回滚到某个保存点,而不是回滚整个事务。

示例:回滚到指定保存点

  1. 开始事务并更新数据:
START TRANSACTION;
UPDATE Department SET office='E201' WHERE dno='D1';
SAVEPOINT S1;
UPDATE Department SET office='E202' WHERE dno='D1';
SAVEPOINT S2;
UPDATE Department SET office='E203' WHERE dno='D1';
  1. 回滚到保存点S1:
ROLLBACK TO SAVEPOINT S1;

此时,S1 之后的所有操作都被撤销,事务回到 S1 的状态。

7. 事务的执行方式

7.1 串行执行

在单处理器系统中,事务可以串行执行,即一个事务完成后,再开始下一个事务。这种方式虽然简单,但会导致系统资源浪费。

image

7.2 并发执行

事务的并发执行 是指多个事务交替执行,虽然不是严格的并行执行,但可以减少处理器的空闲时间,提高系统效率。

image

提示: 并发执行可能会导致数据冲突,因此需要考虑隔离性的影响。

总结

通过本文的讲解,你应该对MySQL中的事务概念和ACID特性有了清晰的理解。事务 是数据库操作的基本单位,ACID特性 确保了事务的可靠性,而显式事务处理保存点 提供了更灵活的控制。

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

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

相关文章

基于Vue的兴趣活动推荐APP的设计与实现_kaic

摘 要 近年来,随着互联网不断的普及与发展,生活也变的多姿多彩,每个人几乎都有属于自己的小小兴趣圈子,但人们的兴趣却不止一个,大多数人是没有时间为自己的兴趣“买单”的。为了解决我们在生活中对于各种兴趣活动的…

学习笔记缓存篇(一)

1、如何解决热key 1、本地缓存 采用本地缓存的优点在于简单,扩容方便。但是会带来一致性的问题。 2、离散热点key 做法:结合当前节点的ip或者机器的MAC地址去得出一个固定值拼接在key后面。访问时也是根据key,到后端固定的edis上。 优点&…

学习结构体的使用

对于结构体的创建,首先要创建一个结构体类型,像下面这样: 结构体对成员的访问,就是变量名.成员就可以了 当然对于结构体的声明还有一些特殊的声明 结构体的自引用 结构体的重命名

Linux 35.5 + JetPack v5.1.3@CUDA安装和版本切换

Linux 35.5 JetPack v5.1.3CUDA安装和版本切换 1. 源由2. 现象3. 分析3.1 看本质3.2 善动脑3.3 笔记回忆3.4 底层思考3.5 多版本 4. 版本切换5. 总结 1. 源由 最近遇到一些CUDA编程,以及编译链接过程出现一些版本不匹配的问题。 首先,申明下&#xff…

【网络安全的神秘世界】渗透测试基础

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 渗透测试基础 基于功能去进行漏洞挖掘 1、编辑器漏洞 1.1 编辑器漏洞介绍 一般企业搭建网站可能采用了通用模板&#xff…

神经网络的公式推导与代码实现(论文复现)

神经网络的公式推导与代码实现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 概述 本文将详细推导一个简单的神经网络模型的正向传播、反向传播、参数更新等过程,并将通过一个手写数字识别的例子,使用python手写和pytorch…

充电管理芯片

1.接口 typec SBU引脚(辅助通道) SBU引脚是Type-C接口母座中的辅助通道,用于支持附加的功能,如模拟音频和视频传输。通过SBU引脚,Type-C接口母座可以实现更广泛的连接应用,包括连接到外部显示器、音频设备…

【前端】main.js中app.vue中 render函数的作用及使用背景

vue.js中的main.js中的作用是将app组件挂载到页面中&#xff0c;其中app组件是汇总所有组件元素的组件。main.js的创建vue实例。 #认为的版本 import APP from ./App.vue;new Vue({el:#root,template:<App></App>,components:{App}, })#实际的版本 /* 整个项目的入…

基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(带Qt界面)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 验证功能一、概述 本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能,创建Qt工程,在工程里面通过点击按钮,实现opencv通过摄像头采集视频图像,将采集的视频图像送给显示屏LCD进…

docker-compose elasticsearch 集群搭建(用户登录+https访问)

文章目录 前言docker-compose elasticsearch 集群搭建(用户登录+https访问)1. 效果2. 制作elasticsearch + 分词器镜像2.1. 拉取elasticsearch:7.11.12.2. 制作特定版本镜像3. docker-compose elasticsearch 集群制作4. es账户密码初始化前言 如果您觉得有用的话,记得给博主点…

<Python>基于python使用PyQt6编写一个延迟退休计算器

前言 这两天关于延迟退休的话题比较火&#xff0c;官方也退出了延迟退休计算器的小程序&#xff0c;我们使用python来实现一个。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;python 库&#xff1a;pyqt6 程序依据 程序的算法依据…

常见本地大模型个人知识库工具部署、微调及对比选型

文章目录 常见本地大模型个人知识库工具部署、微调及对比选型知识库侧AnythingLLMMaxKBRAGFlowFastGPTDifyOpen WebUI小结大模型侧OllamaLM StudioXinference小结大模型侧工具安装部署实践Ollama部署Windows部署OllamaLinux部署OllamaOllama使用技巧模型更换存储路径导出某个模…

外国车牌字符识别与分类系统源码分享

外国车牌字符识别与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

【Java面试】第九天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Spring中如何开启事务&#xff1f;编程式事务声明式事务声明式事务的优点声明式事务的粒度问题声明式事务用不对容易失效 Spring的事务传播机制有哪些&#xff1f;Spring事务失效可能是哪些原因&#xff1f;代理失效的情…

Ubuntu下beanstalkd无法绑定局域网IP地址以及消息队列beanstalkd上的error: JOB_TOO_BIG的解决

一、ubuntu下beanstalkd无法绑定局域网IP地址 今天因为业务需要&#xff0c;我把之前安装的beanstalkd所绑定的IP地址由127.0.0.1改成局域网IP地址&#xff0c;但是怪了&#xff0c;显示beanstalkd已经启动&#xff0c;查看端口监控也显示IP地址变了&#xff0c;但是使用telnet…

matlab绘制不同区域不同色彩的图,并显示数据(代码)

绘图结果如下&#xff1a; 代码如下&#xff1a; A为绘图的数据&#xff0c;每个数据对应着上图中的一个区域&#xff0c;数据大小决定区域的颜色 % 假设有一系列的数据点 Arand(5,6); %A为绘图的数据&#xff0c;数据大小决定颜色 wei_shu%.3f; %代表数据保留三位小…

[Golang] Channel

[Golang] Channel 文章目录 [Golang] Channel什么是Channelchannel的初始化channel的操作双向channel和单向channel为什么有channel有缓冲channel和无缓冲channlechannel做一把锁 从之前我们知道go关键字可以开启一个Goroutine&#xff0c;但是Goroutine之间的通信还需要另一个…

Recyclerview实现滑动居中缩放菜单

最近项目中需要的一个滑动菜单效果:要求当前居中选项放大、滑动时有缩放效果、点击两边的选项滑动到屏幕中央、停止滑动选项停留在屏幕中间(类似viewPager的效果),为了直观,先上最终实现效果图: 大体思路: Recyclerview item头尾添加空数据,让第一个和最后一个item也能…

计算机组成原理(第二次笔记)

各种码 真值 (书写用)&#xff1a; 将用“”、“-” 表示正负的二进制数称为真值 机器不能识别书写格式&#xff0c;故用“0/1”表示“/-”符号。 机器码 (机器内部使用)&#xff1a; 将符号和数值一起编码表示的二进制数称为机器码。 常用机器码&#xff1a;原码、 反码、 补…

Linux网络编程 --- 高级IO

前言 IO Input&&Output read && write 1、在应用层read && write的时候&#xff0c;本质把数据从用户层写给OS --- 本质就是拷贝函数 2、IO 等待 拷贝。 等的是&#xff1a;要进行拷贝&#xff0c;必须先判断读写事件成立。读写事件缓冲区空间满…