当前位置: 首页 > 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 令牌的字段…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...