[MySQL]事务的理论、属性与常见操作

news2025/2/3 18:26:37

目录

一、事物的理论

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)

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

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

相关文章

沙皮狗为什么禁养?

各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚…

DeepSeek-R1模型1.5b、7b、8b、14b、32b、70b和671b有啥区别?

deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别?码笔记mabiji.com分享:1.5B、7B、8B、14B、32B、70B是蒸馏后的小模型,671B是基础大模型,它们的区别主要体现在参数规模、模型容量、性能表现、准确性、训练成本、推理成本…

#define,源文件与头文件,赋值表达式

1.#define 1.1定义 #define 是一个预处理指令,用于定义宏 宏,是预处理阶段(在编译之前)由预处理器处理的代码片段 1.2使用 1.2.1 #define 可以定义常量 #define PI 3.14159 1.2.2 #define 可以定义宏函数 #define SQUARE(x) ((…

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B 前言环境准备所需工具创建虚拟环境安装VLLM及依赖库 模型下载安装Hugging Face CLI下载DeepSeek-R1-Distill-Qwen-32B 模型启动启动命令启动确认 模型验证发送API请求示例输出 注意事项参考链接 前言 VLLM 是一个…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.13 降维打击:扁平化操作的六种武器

1.13 降维打击:扁平化操作的六种武器 目录 #mermaid-svg-bbLxDryjxBbXe3tu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bbLxDryjxBbXe3tu .error-icon{fill:#552222;}#mermaid-svg-bbLxDryjxBbXe3tu…

Oracle Primavera P6 最新版 v24.12 更新 2/2

目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…

AI-on-the-edge-device - 将“旧”设备接入智能世界

人工智能无处不在,从语音到图像识别。虽然大多数 AI 系统都依赖于强大的处理器或云计算,但**边缘计算**通过利用现代处理器的功能,使 AI 更接近最终用户。 本项目演示了使用 **ESP32**(一种低成本、支持 AI 的设备)进行…

Openfga 授权模型搭建

1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置? 根据官网来看 openfga/.config-schema.json at main openfga/openfga GitHub 这里讲述详细的每一个配置每一个类型 这些配置有…

C++模板编程——可变参函数模板之折叠表达式

目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开,这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念,引入折叠表达式的目的是为了…

ArkTS渲染控制

文章目录 if/else:条件渲染ArkUI通过自定义组件的build()函数和@Builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快…

UbuntuWindows双系统安装

做系统盘: Ubuntu20.04双系统安装详解(内容详细,一文通关!)_ubuntu 20.04-CSDN博客 ubuntu系统调整大小: 调整指南: 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …

【leetcode详解】T598 区间加法

598. 区间加法 II - 力扣(LeetCode) 思路分析 核心在于将问题转化, 题目不是要求最大整数本身,而是要求解最大整数的个数 结合矩阵元素的增加原理,我们将抽象问题转为可操作的方法,其实就是再找每组ops中…

备考蓝桥杯嵌入式2:使用LCD完成显示

LCD LCD(液晶显示器,Liquid Crystal Display)是一种常见的平面显示技术,广泛应用于电视、电脑显示器、手机屏幕等设备。蓝桥杯中,也有涉及到使用LCD来完成字符串显示的要求和操作。 考场上会给予LCD的驱动包&#xf…

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志(网络爬虫学习:应用selenium从搜…

Elasticsearch的索引生命周期管理

目录 说明零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的?如何监控和调整Elasticsearch ILM策略的性能? 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整…

Observability:实现 OpenTelemetry 原生可观察性的商业价值

作者:来自 Elastic David Hope 利用开放标准和简化的数据收集转变组织的可观察性策略。 现代组织面临着前所未有的可观察性挑战。随着系统变得越来越复杂和分散,传统的监控方法难以跟上步伐。由于数据量每两年翻一番,系统跨越多个云和技术&am…

Zabbix 推送告警 消息模板 美化(钉钉Webhook机器人、邮件)

目前网络上已经有很多关于Zabbix如何推送告警信息到钉钉机器人、到邮件等文章。 但是在搜索下来,发现缺少了对告警信息的美化的文章。 本文不赘述如何对Zabbix对接钉钉、对接邮件,仅介绍我采用的美化消息模板的内容。 活用AI工具可以减轻很多学习、脑力负…

罗格斯大学:通过输入嵌入对齐选择agent

📖标题:AgentRec: Agent Recommendation Using Sentence Embeddings Aligned to Human Feedback 🌐来源:arXiv, 2501.13333 🌟摘要 🔸多代理系统必须决定哪个代理最适合给定的任务。我们提出了一种新的架…

机器学习7-全连接神经网络3-过拟合与超参数

机器学习6-全连接神经网络3-过拟合欠拟合 过拟合应对过拟合-最优方案:获取更多的训练数据应对过拟合-次优方案:正则化应对过拟合-次优方案2:随机失活综合考量 超参数超参数优化方法 过拟合 机器学习的根本问题是优化和泛化的问题。优化——是…