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

MySQL(五)--- 事务

1、CURD操作不加控制时,可能会出现什么问题

即:类似于线程安全问题,可能会导致数据不一致问题。

因为,MySQL内部本身就是多线程服务。 

1.1、CURD满足什么属性时,才能避免上述问题

1、买票的过程得是原子的吧。

2、买票互相应该不能影响吧。

3、买完票应该要永久有效吧。

4、买前,和买后都要是确定的状态吧。

2、什么是事务

1、事务就是一组DML(数据操作语言)语句组成,这些语句在逻辑上存在相关性。

2、这一组DML语句要么全部成功,要么全部失败,是一个整体。

3、MySQL提供一种机制,保证我们达到这样的效果。

4、事务还规定不同的客户端看到的 数据是不相同的。

因此,一个完整的事务,绝对不是一个简单的sql语句的组成,还需要满足以下4个属性:

2.1、事务的4个属性 -- ACID

原子性(Atomicity)

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。

在执行过程中如果出错,会回滚到事务开始的时候。就像似事务根本没有开始。

一致性(Consistency)

在事务开始之前和结束之后,数据库的完整性没有发生破坏。

这表示写入的资料必须完 全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工 作。

隔离性(Isolation)

数据库允许多个并发事务同时对其数据进行读写和修改的能力。

隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务的隔离分为不同的级别。

持久性(Durability)事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

上面的四个属性,可简称为ACID。

2.2、为什么会出现事务

事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型, 不需要我们去考虑各种各样的潜在错误和并发问题。

可以想一下当我们使用事务时,要么提交,要么回滚,我 们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧。

因此事务本质上是为了应用层服 务的.而不是伴随着数据库系统天生就有的

备注:我们后面把 MySQL 中的一行信息,称为一行记录。

2.3、事务的版本支持--InnoDB

在 MySQL 中只有使用了InnoDB数据库引擎的数据库或表才支持事务,MyISAM不支持。

查看数据库引擎:

mysql> show engines; --- 表格显示
mysql> show engines \G --- 行显示
*************************** 1. row ***************************Engine: InnoDB    -- 引擎名称
Support: DEFAULT   -- 默认引擎
Comment: Supports transactions, row-level locking, and foreign keys -- 描述
Transactions: YES       -- 支持事务
XA: YESSavepoints: YES       -- 支持事务保存点
*************************** 2. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tablesTransactions: NOXA: NOSavepoints: NO*************************** 3. row ***************************Engine: MEMORY    --内存引擎
Support: YESComment: Hash based, stored in memory, useful for temporary tablesTransactions: NOXA: NOSavepoints: NO*************************** 4. row ***************************Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappears)
Transactions: NOXA: NOSavepoints: NO*************************** 5. row ***************************Engine: MyISAM    
Support: YESComment: MyISAM storage engineTransactions: NO           -- MyISAM不支持事务
XA: NOSavepoints: NO*************************** 6. row ***************************Engine: CSVSupport: YESComment: CSV storage engineTransactions: NOXA: NOSavepoints: NO*************************** 7. row ***************************Engine: ARCHIVESupport: YESComment: Archive storage engineTransactions: NOXA: NOSavepoints: NO*************************** 8. row ***************************Engine: PERFORMANCE_SCHEMASupport: YESComment: Performance SchemaTransactions: NOXA: NOSavepoints: NO*************************** 9. row ***************************Engine: FEDERATEDSupport: NOComment: Federated MySQL storage engineTransactions: NULLXA: NULLSavepoints: NULL9 rows in set (0.00 sec)

3、事务的提交方式

事务的提交方式常见有两种:

自动提交。

手动提交。

查看当前事务的提交方式:

mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | ON    |+---------------+-------+1 row in set (0.41 sec)

此时就是显示,打开了自动提交方式。

通过SET来改变提交方式:

1、AUTOCOMMIT = 0,禁止自动提交 -- 即手动提交。

 mysql> SET AUTOCOMMIT=0;            
Query OK, 0 rows affected (0.00 sec)#SET AUTOCOMMIT=0 禁止自动提交
mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | OFF   |+---------------+-------+1 row in set (0.00 sec)

2、AUTOCOMMIT = 1,开启自动提交。

 mysql> SET AUTOCOMMIT=1;           
#SET AUTOCOMMIT=1 开启自动提交
Query OK, 0 rows affected (0.00 sec)mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | ON    |+---------------+-------+1 row in set (0.01 sec)

4、事务的常见操作方式

1、便于演示,将隔离级别设置为读未提交:

mysql> set global transaction isolation level READ UNCOMMITTED;
Query OK, 0 rows affected (0.01 sec)设置完成后需要重新登陆mysql才生效
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-UNCOMMITTED        |
+-------------------------+
1 row in set (0.00 sec)

2、创建测试表account:

mysql> create table if not exists account(-> id int primary key,-> name varchar(50) not null default '',-> balance decimal(10,2) not null default 0.0-> )ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

4.1、正常演示:证明事务的开始和回滚:

查看事务的提交方式,故意设置为自动提交,看是否影响begin
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.10 sec)开启事务,推荐使用begin
mysql> start transaction;
Query OK, 0 rows affected (0.02 sec)设置一个回滚点
mysql> savepoint save1;
Query OK, 0 rows affected (0.00 sec)插入一条数据
mysql> insert into account values (1,'张三',1000);
Query OK, 1 row affected (0.01 sec)再设置一个回滚点
mysql> savepoint save2;
Query OK, 0 rows affected (0.00 sec)再插入一条数据
mysql> insert into account values (2,'李四',2000);
Query OK, 1 row affected (0.00 sec)查看数据是否都存在
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
|  2 | 李四   | 2000.00 |
+----+--------+---------+
2 rows in set (0.00 sec)回滚到第二个回滚点
mysql> rollback to save2;
Query OK, 0 rows affected (0.00 sec)再查看数据,第二条数据没了
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
+----+--------+---------+
1 row in set (0.00 sec)直接rollback,回滚到最开始
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)数据全都没了
mysql> select * from account;
Empty set (0.00 sec)

4.2、非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交):

终端A:

当前表内没数据
mysql> select * from account;
Empty set (0.00 sec)提交方式为自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)插入数据
mysql> insert into account values (1,'张三',1000);
Query OK, 1 row affected (0.01 sec)查看数据存在,但是没有commit
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
+----+--------+---------+
1 row in set (0.00 sec)然后使用ctrl + \ 来异常终止MySQL服务
mysql> Aborted

终端B:

终端A崩溃前查看数据 --- 存在
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
|  1 | 张三   | 1000.00 |
+----+--------+---------+
1 row in set (0.00 sec)终端A崩溃后查看数据 --- 数据自动回滚
mysql> select * from account;
Empty set (0.00 sec)

4.3、非正常演示2 - 证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化

终端A:

mysql> select * from account;
Empty set (0.00 sec)mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 ro

相关文章:

MySQL(五)--- 事务

1、CURD操作不加控制时,可能会出现什么问题 即:类似于线程安全问题,可能会导致数据不一致问题。 因为,MySQL内部本身就是多线程服务。 1.1、CURD满足什么属性时,才能避免上述问题 1、买票的过程得是原子的吧。 2、买票互相应该不能影响吧。 3、买完票应该要永久有效吧。…...

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…...

机器学习经典算法

机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...

Scala中的泛型

类型参数 ---- 泛型(数据类型是变化的) (1) 可以有多个 (2) 名称合法就行&#xff0c;没有固定的&#xff0c;一般用T(Type) 在Scala中&#xff0c;用[]表示。在Java中用<>表示 1. 与数据类型的区别 List是数据类型&#xff0c;表示一个列表。[Int]表示泛型&#xff0c;它…...

数据分析特征标准化方法及其Python实现

数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return (distance(a…...

前端数据安全防护(控制台)

目录 前言 禁用右键菜单 禁用快捷键 监控控制台 完整逻辑 前言 前端的数据在浏览器中一直处于一个裸奔的状态&#xff0c;只要是稍微懂一点计算机的人&#xff0c;都可以在浏览器的控制台中拿到前端页面的所有数据&#xff0c;包括和后端的交互数据。为了…...

自己玩虚拟机:vagrant,virtual box,centos

vagrant 访问Vagrant官网 https://www.vagrantup.com/ 点击Download Windows&#xff0c;MacOS&#xff0c;Linux等 选择对应的版本 AMD64 (x86_64) I686 (x86) 傻瓜式安装 命令行输入vagrant&#xff0c;测试是否安装成功 vagrant -v 可以查看当前版本 virtual box 访…...

Frida框架HOOK RegisterNatives函数

使用Frida框架HOOK RegisterNatives函数&#xff0c;获取动态注册的函数地址、名称、签名、class名称、所属的so文件名称、so文件加载基址、函数在so文件中的地址。 废话不多说&#xff0c;上代码&#xff1a; 运行命令&#xff1a;frida -U -f in.****** -l RegisterNatives…...

[创业之路-189]:《华为战略管理法-DSTE实战体系》-2- 生存与发展的双重旋律:短期与长期、战术与战略的交响乐章

目录 生存与发展的双重旋律&#xff1a;短期与长期、战术与战略的交响乐章 一、生存&#xff1a;短期视角下的战术布局 二、发展&#xff1a;长期视角下的战略规划 三、短期与长期、战术与战略的融合与平衡 四、结语&#xff1a;在生存与发展的交响曲中奏响辉煌 生存与发展…...

TDengine 部署

TDengine是一款开源高性能的时序数据库&#xff0c;其部署过程可以根据不同的环境和需求进行灵活配置。以下将详细介绍TDengine的部署步骤&#xff0c;包括单节点部署和集群部署。 一、单节点部署 下载安装包&#xff1a; 访问TDengine的官方网站或GitHub仓库&#xff0c;下载…...

【前端】20种 Button 样式

20种 Button 样式 在前端开发中&#xff0c;Button 按钮的样式设计是提升用户交互体验的重要一环。以下是20种常见的Button样式&#xff0c;这些样式主要基于CSS实现&#xff0c;可以根据具体需求进行调整和组合。 1. 默认样式 CSS 样式&#xff1a;.button { background-co…...

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理任务中展现了强大的能力&#xff0c;但为了使其更贴合特定应用场景&#xff0c;通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据&#xff0c;并通过具体…...

mysql的执行计划分析和索引下推以及索引长度计算

1 执行计划介绍 执行计划&#xff08;Execution Plan&#xff09;是数据库查询优化的重要工具&#xff0c;用于展示数据库如何执行 SQL 查询的详细过程。它包含了查询操作的步骤、各个步骤的执行顺序、使用的索引、访问的表、连接方式、预计的成本等信息 可以显示SQL语句最终…...

C#中的string操作详解-截取、分割、连接、替换等

在C#中&#xff0c;string 类提供了许多用于操作字符串的方法&#xff0c;包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例&#xff1a; 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法&#xff1a; //从startIndex开始截取&#xff0c;…...

Redis Cluster 分片机制

Redis 集群是 Redis 提供的一种分布式实现&#xff0c;用于水平扩展数据存储能力。通过 Redis 集群&#xff0c;可以将数据分片存储在多个 Redis 节点上&#xff0c;同时提供高可用性和故障转移功能。 分片&#xff08;Sharding&#xff09;&#xff1a; Redis 集群将数据划分…...

论文结论:GPTs and Hallucination Why do large language models hallucinate

GPTs and Hallucination 当一个主题有普遍共识&#xff0c;并且有大量语言可用于训练模型时&#xff0c;大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】&#xff0c;或者主题有争议&#xff0c;或是对主题没有明确共识的情况下&#xff0c;就…...

CSS在线格式化 - 加菲工具

CSS在线格式化 打开网站 加菲工具 选择“CSS在线格式化” 或者直接访问 https://www.orcc.online/tools/css 输入CSS代码&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...

组件通信(父传子,子传父,跨组件通信)

组件&#xff08;component&#xff09;是vue.js最核心的功能&#xff0c;是可扩展的HTML元素。每个页面都是一个HTML。以.vue结尾的文件&#xff0c;都可以叫组件。 场景&#xff1a;将一个完整的项目&#xff0c;拆分成不同的功能模块。 注意&#xff1a;组件首字母要大写。 …...

JWT 令牌:原理、应用与安全考量

深入理解 JWT 令牌&#xff1a;原理、应用与安全考量 文章目录 深入理解 JWT 令牌&#xff1a;原理、应用与安全考量一、引言二、JWT 令牌与传统方式的区别&#xff08;一&#xff09;传统身份验证方式的特点与局限&#xff08;二&#xff09;JWT 令牌的优势 三、JWT 令牌的字段…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...