[MySQL]事务的理论、属性与常见操作
目录
一、事物的理论
1.什么是事务
2.事务的属性(ACID)
3.再谈事务的本质
4.为什么要有事务
二、事务的操作
1.事务的支持版本
2.事务的提交模式
介绍
自动提交模式
手动提交模式
3.事务的操作
4.事务的操作演示
验证事务的回滚
事务异常的自动回滚
一、事物的理论
场景:一个火车售票系统,从甲地到乙地的票总共有100张,卖到最后的时候,客户端A查看到还有一张票,讲票买了回来,但是还没有执行数据库更新操作的时候,客户端B读取了数据库中票的个数数据,发现也还有一张票,那么就也卖走了,那么客户端A和客户端B买的其实是同一张票,那么就会出问题了。
场景:在转账的时候,客户端A转了1000元之后,成功扣款了,并更新了客户端A的余额数目,但是没等到客户端B的数据库表更新余额增加1000元,服务器出了一点点小问题,那么就没有执行增加1000元的操作,但是客户端A却少1000元,这样就也是非常不合理的。
我们允许特殊情况的发生,但是在特殊情况发生的时候,应该有一套完整的解决方案来解决问题,尤其是数据库在实际开发中都是处于高并发访问的环境下,那么上述的场景就更应该保证不会出问题了。
1.什么是事务
事务的本质就是一组DML语句构成的。这些语句在业务逻辑上存在一定的相关性。例如上述的转账操作,有修改A的数据库表,修改B的数据库表等操作,这些操作存在一定的相关性共同构成了一个业务逻辑,这些SQL语句组合起来称为一个事务。所以对于事务,不应该站在MySQL角度,应该站在使用者的角度去看待,使用者想要完成一个业务操作,对应需要使用的一条或者多条SQL语句就是构成了一个事务。
对于事务的执行操作,如果执行要么就是全部成功,要么就全部失败,事务中的多条DML语句是一个整体。MySQL提高一种机制,保证我们可以达到这种效果。这样的话,上述转账转到一半失败的场景,那么就会将A的值减少1000的操作也视为失败,就不会在操作数据库减少了。
2.事务的属性(ACID)
在实际应用场景中,同一时间会有大量的业务包装成事务,向MySQL服务器发送事务的请求处理,而每个事务又包含了一个或多个SQL语句,那么这些大量的SQL语句如果访问的是同一张表的话,不加保护就一定会出问题,和多线程的线程安全问题类似。还有就是我们在执行事务的时候,执行到一般不想执行了,该怎么办,对于已经执行过的操作该如何处理呢?
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不执行,不会结束在中间的某个患者,事务在执行过程中出错,或者不想继续执行的时候,会被回滚到事务开始前的一个状态,所以说之前执行完的操作就会失效了。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全复合所有的预设规则。
- 隔离性:数据库允许多个并发的事务同时对数据进行读写和修改的操作,隔离性可以防止多个事务在并发执行的时候,由于交叉执行而导致的数据不一致,事务的隔离又分为了多个级别,分为未提交、都提交、可重复读和串行化。
- 持久性:事务处理结束之后,对数据的修改是永久性的,即使系统故障也不会丢失,因为已经持久化存放到磁盘当中了。
对于原子性和持久性比较好理解,那么一致性是什么意思呢?就是事务在执行操作之前,就可以预期到执行的操作以及执行后的结果了,并且执行的时候完全按照预期的操作执行。这样可以预期的操作,就大大降低了出现问题的概率。对于一致性,MySQL是没有做任务的操作和约束策略的,而是通过原子性、持久性和隔离性去实现了事务的一致性,也就是说满足了事务的其他三个属性也就满足了事务的一致性。所以说一致性单纯靠MySQL是无法实现了,还需要用户的配合。
3.再谈事务的本质
事务的本质就是:在ACID属性的加持下的一条或多条DML语句的集合。从底层来看的话,数据库的使用者会使用特殊SQL语句指明事务的开始,在MySQL内部其实就相当于是创建了一个事务对象,使用者在事务内部输入的SQL语句,都会放到事务对象的内部,然后事务对象会放到数据库的事务运行队列当中。这样就把统一时间的大量事务进行了管理。
4.为什么要有事务
事务被设计出来是为了应用层服务的,而不是数据库天然就有的,当我们在执行一些业务操作的时候,只有两种情况,我们不需要考虑中间某一部出错该如何处理,要么就都执行,要么就都不执行,方便了程序员的操作。数据库本身设计出来就是为了方便程序员对于数据的管理的,如果让并发访问的安全问题以及操作的错误问题交给程序员来判断和解决的话,那么数据库设计出来的意义就大大降低了,会提高程序员的编程难度。
二、事务的操作
1.事务的支持版本
show engines;
市面上有很多数据库都支持事务的操作,MySQL也是其中之一,但是是否支持事务是按照存储引擎来划分的,例如Innodb存储引擎就支持事务,而MyISAM存储引擎就不支持事务的操作,可以使用show engines查看数据库支持的存储引擎,其中的Transactions字段就表示是否支持事务。
2.事务的提交模式
介绍
show variables like 'autocommit' //查看数据库的事务提交方式
set autocommit = 1/0; //设置数据库的事务提交方式,1为自动提交
事务提交分为手动提交和自动提交,可以使用show variables like 'autocommit'进行查看属性字段,如果是ON的话就代表的是自动提交。
提交模式主要是控制事务的提交行为,他决定了数据库操作是立即提交还是在显示的输入提交语句命令之后再去提交,这里的提交也就是将SQL语句修改的数据库内容,持久化的写入到内存当中,再提交之前都是在数据库内存缓冲区当中进行操作的。
自动提交模式
在自动提交模式下,每一条SQL语句都会被数据库认为是一个单独的事务,并且在语句执行完成后自动提交,不用我们显示的去输入提交命令了。但是这种只适用于简单的SQL语句,一旦涉及到一些复杂的业务逻辑的话,一条SQL语句作为的事务是无法去完成完整的业务的。
手动提交模式
在该模式下,需要显示的使用BEGIN或者START TRANSACTION开启一个事务,并进行操作各种SQL操作,但是这些操作都是在内存中的,最后需要手动的使用commit语句才可以完成事务的提交。如果我们设置的是自动提交的话,在我们开启事务的时候,不会受影响,都需要我们手动进行提交操作。
3.事务的操作
启动事务
语句:start transaction; / begin;
对于功能上的区别不大,都是用来开启一个事务的,但是begin属于SQL标准中的一个关键字,用于开启一个事务,他在大多数支持书屋的数据库系统中都可以使用,有很好的兼容性。而前者则属于是MySQL独有的语法,但是他可以在开启事务的同时,为事务设置一些特性内容,提高了更灵活的事务控制。
创建保存点
语句:savepoint xxxx;
回滚操作
语句:rollback [xx];
可以设置回滚到哪一个保存点,如果不设置的话,会回滚到最初。但是前提是该事务没有被提交,如果提交了之后就无法进行事务的回滚操作了。
提交操作
语句:commit;
事务的操作是原子性的,而commit操作就是证明该操作完整的执行了,那么所有对数据库的操作内容才会被永久的存放到磁盘当中。在没有提交之前所有的操作都是在MySQL的内存缓冲区当中进行的。
如果说在事务执行到一半的时候,不管什么原因,客户端退出了,没有执行提交操作,基于事务的原子性,那么MySQL会自动回滚到事务的最开始,也就相当于该事务什么都没有操作。可以使用ctrl + \模拟异常终止MySQL数据库。
4.事务的操作演示
前提操作:
//创建数据库表
mysql> create table account (-> id int primary key,-> name varchar(20) default '',-> blance decimal(10, 2) default 0.0-> )engine=innodb charset=utf8;
Query OK, 0 rows affected, 1 warning (0.05 sec)//设置隔离级别为读未提交--以后解释
mysql> set global transaction isolation level READ UNCOMMITtED;
Query OK, 0 rows affected (0.00 sec)//查看是否设置成功
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)//重启系统
mysql> quit;
验证事务的回滚
//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//设置保存点1
mysql> savepoint save1;
Query OK, 0 rows affected (0.00 sec)//插入数据1
mysql> insert into account values(1, '张三', 100);
Query OK, 1 row affected (0.00 sec)//设置保存点2
mysql> savepoint save2;
Query OK, 0 rows affected (0.00 sec)//插入数据2
mysql> insert into account values(2, '李四', 200);
Query OK, 1 row affected (0.00 sec)//查看此时的表内容
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//回滚到保存点2
mysql> rollback to save2;
Query OK, 0 rows affected (0.02 sec)//查看数据,发现在保存点2后插入的数据在表中查看不到了
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
+----+--------+--------+
1 row in set (0.00 sec)//回滚到事务的最开始
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)//查看数据发现表中的所有数据都不见了
mysql> select * from account;
Empty set (0.00 sec)
事务异常的自动回滚
//客户端A-------------------------------------------------------------
//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//插入两条数据
mysql> insert into account values (1, '张山', 100);
Query OK, 1 row affected (0.00 sec)mysql> insert into account values (2, '李四', 100);
Query OK, 1 row affected (0.00 sec)//异常终止客户端A
mysql> Aborted//客户端B-------------------------------------------------------------
//客户端A终止前查看表
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张山 | 100.00 |
| 2 | 李四 | 100.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//终止后查看表
mysql> select * from account;
Empty set (0.00 sec)
相关文章:
[MySQL]事务的理论、属性与常见操作
目录 一、事物的理论 1.什么是事务 2.事务的属性(ACID) 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...

RS485接口EMC
A.滤波设计要点 L1为共模电感,共模电感能够衰减共模干扰,对单板内部的干扰以及外部的干扰都能抑制,能提高产品的抗干扰能力,同时也能减小通过485信号线对外的辐射,共模电感阻抗选择范围为120Ω/100MHz ~2200Ω/100MHz…...

快速上手mybatis教程
基础知识 MyBatis 是一款优秀的持久层框架,其核心组件主要包括以下部分: SqlSession 作用:SqlSession 是 MyBatis 的核心接口,负责与数据库进行通信,执行 SQL 语句,并返回查询结果。它是 MyBatis 的一次会…...

本地部署DeepSeek-R1保姆级教程
近期,我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行,提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1,可以参考以下完整的教程,涵盖Mac 版本…...
blender 相机参数
目录 设置相机参数: 3. 设置相机参数示例 4. 相机透视与正交 5. 额外的高级设置 设置相机参数: 设置渲染器: 外参转换函数 转换测试代码: 获取blender渲染外参: 设置相机参数: 3. 设置相机参数示…...

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用
上下拉电阻作用 在通用输入的时候,也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态,这样才能检测到不同电平状态。 如何保持电平状态? 1. 可以通过芯片内部的上下拉电阻,由于是弱上下拉一般不用 2. 硬件外界一个…...

Maven工程核心概念GAVP详解:从命名规范到项目协作的基石
Maven工程核心概念GAVP详解:从命名规范到项目协作的基石 一、GAVP是什么? 在Maven工程中,GAVP是四个核心属性的缩写:GroupId、ArtifactId、Version、Packaging。这组属性为项目在Maven仓库中提供了唯一标识,类似于“项…...
如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析
如何利用DeepSeek开源模型打造医疗领域专属AI助手?从微调到部署全流程解析 医疗人工智能正迎来爆发式增长,但在实际应用中,通用大模型往往存在医学知识不精准、诊断逻辑不严谨等问题。本文将手把手带您实现医疗垂直领域大模型的定制化训练&a…...

Redis|前言
文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…...

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它
据悉折叠手机开创者三星披露了一份专利,通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力,希望通过这种方式进一步增强折叠手机的可靠性和耐用性,来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…...
Leetcode面试高频题分类刷题总结
https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类(Sort): 基础知识:快速排序(Quick Sort), 归并排序(Merge Sort)的…...
Vue.js `v-memo` 性能优化技巧
Vue.js v-memo 性能优化技巧 今天我们来聊聊 Vue 3.2 引入的一个性能优化指令:v-memo。如果你在处理大型列表或复杂组件时,遇到性能瓶颈,那么 v-memo 可能会成为你的得力助手。 什么是 v-memo? v-memo 是 Vue 3.2 新增的内置指…...

Altium Designer绘制原理图时画斜线的方法
第一步:检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项,点击OK即可。如下图所示: 然后在划线时,按下shift空格就能够切换划线…...
在K8S中,有哪几种控制器类型?
在Kubernetes中,控制器(Controller)是用来确保实际集群状态与所需状态保持一致的关键组件。它们监控并自动调整系统以达到预期状态,以下是Kubernetes中主要的几种控制器类型: ReplicationController(RC&am…...
什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...

Golang 并发机制-3:通道(channels)机制详解
并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang(也称为 Go)通过通道(channels)这一特性,能够可靠且优雅地实现并发通信。本文将揭示通道的概念,解释其在并发编程中的作用,并提供…...
kamailio的kamctl的使用
kamctl 是 Kamailio SIP 服务器的管理工具,用于执行各种管理任务,如启动、停止、重启 Kamailio 进程,管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明: 1. 启动、停止、重启 Kamailio start: 启动…...

HarmonyOS:ArkWeb进程
ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…...
UI线程用到COM只能选单线程模型
无论用不用UI库,哪怕是用Win32 API手搓UI,UI线程要用COM的话,必须初始化为单线程单元(STA),即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);,不能用MULTITHREADTHREADED。 实际上,很多(WPF等)UI库若…...

LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介:处理更…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...