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

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: MYSQL

目录

事务的概念 

事务的ACID特性

使用事务

查看支持事务的存储引擎 

事务的语法 

保存点 

自动/手动提交事务

事务的隔离性和隔离级别


事务的概念 

首先,得了解什么是事务? 事务将一组SQL语句打包成一个整体,在这组SQL语句的执行过程中,要么全部成功,要么全部失败,以保证数据的一致性。

事务的ACID特性

事务的ACID特性指的是 Atomicity (原子性), Consistency (一致性), Isolation (隔离性)和 Durability (持久性)。 

Atomicity(原子性):一个事务中的所有操作,要么全部成功,要么全部失败,不会出现只执
行了一半的情况,如果事务在执行过程中发生错误,会回滚(Rollback)到事务开始前的状
态,就像这个事务从来没有执行过一样;
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性不会被破坏。这表
示写入的数据必须完全符合所有的预设规则,包括数据的精度、关联性以及关于事务执行过程中服
务器崩溃后如何恢复。简单理解就是事务开始前后的数据量要一致;
Isolation(隔离性):数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多
个事务并发执行时由于交叉执行而导致数据的不一致。事务可以指定不同的隔离级别,以权衡在不
同的应用场景下数据库性能和安全;
Durabi礼ity(持久性):事务处理结束后,对数据的修改将永久的写入存储介质,即便系统故障
也不会丢失。

正因为事务具备上述四个特性,保证了在使用事务过程中,要么提交,要么回滚,不用去考虑网络异常,服务器宕机等其他因素,因此事务在数据库的使用是非常频繁的。

既然事务这么好用,那么我们该怎么去使用事务呢? 

使用事务

查看支持事务的存储引擎 

在使用事务之前,得查看我们本机的数据库是否支持事务。

在MySQL中支持事务的存储引擎是InnoDB,可以通过 show engines; 语句查看:

知道了本机中的数据库是支持事务之后,便可以开始进行事务了。

事务的语法 

-- 开始一个新的事务
start transaction;
-- 或者下面这种写法
begin;-- 提交当前事务,并对SQL语句的执行而影响的数据进行持久化保存
commit;-- 回滚当前事务,并取消SQL语句的执行而影响的数据
rollback;

注意:无论是commit 还是 rollback 都会把事务关闭。

下面就来进行实操:

-- 开启事务
start transaction;-- 插入一条数据
insert into student values (NULL, '小红', 18, 0);-- 在事务中查看student表中的结果集
select * from student;-- 回滚事务
rollback;-- 在回滚之后,再查看student表中的结果集
select * from student; 

从上面的结果,我们就可以看出回滚之后,事务中的SQL语句全部失效。现在我们再来观察commit 的效果。 

-- 开启事务
start transaction;-- 插入一条数据
insert into student values (NULL, '小红', 18, 0);-- 在事务中查看student表中的结果集
select * from student;-- 提交事务
commit;-- 在提交之后,再查看student表中的结果集
select * from student; 

从上面的结果,我们可以看出提交事务之后,事务中的SQL语句便生效了。 

保存点 

在事务执行的过程中设置保存点,回滚时指定保存点可以把数据恢复到保存点的状态。当事务中有多个修改数据的SQL语句时(包括插入、删除、更新),便可以设置多个保存点,以保证数据的一致性和操作方便。

语法:

savepoint savepoint_name; 

示例:

-- 开启事务
start transaction;-- 修改多条数据savepoint sp1; -- 设置第一个保存点
delete from student where id = 8 or id = 9;
select * from student;savepoint sp2; -- 设置第二个保存点
insert into student values (NULL, '小丽', 19, 0);
select * from student;savepoint sp3; -- 设置第三个保存点
update student set age = 20 where name = '张三';
select * from student;-- 可以通过回滚到某一个保存点来取消修改
rollback to sp3; 
select * from student;-- 如果rollback后面啥也不跟,那就是默认回滚到事务开始之前,并关闭事务
rollback;
select * from student;

自动/手动提交事务

默认情况下,MySQL是自动提交事务的,也就是说我们执行的每个修改操作,比如插入、更新和删除,都会自动开启一个事务并在语句执行完成之后自动提交,发生异常时自动回滚。即每一条SQL语句对应着一个事务。

查看当前事务是否自动提交可以使用以下语句:

show variables like 'autocommit';

如果value对应的是off,就是关闭的意思。

可以通过以下语句设置事务为自动或手动提交:

-- 设置事务为自动提交
set autocommit = 1; -- 方式一
set autocommit = on; -- 方式二-- 设置事务为手动提交
set autocommit = 0; -- 方式一
set autocommit = off; -- 方式二

其实就是把自动提交开启或者关闭即可。

使用事务的时候,要注意一下三点:

1、只要使用start transaction 或 begin 开启事务,必须要通过commit 提交才会持久化,与是否设置set commit 无关。因为我们手动开启事务之后,必须要自己手动关闭事务。

2、手动提交模式下,不用显示开启事务,执行修改操作后,提交或回滚事务时直接使用commit
或rollback。因为手动提交下,就是需要我们自己把事务手动提交。

3、已提交的事务是不能够回滚的。

事务的隔离性和隔离级别

隔离性的概念: 

MySQL服务可以同时被多个客户端访问,每个客户端执行的SQL语句是以事务为基本单位,那么不同的客户端在对同一张表中的同一条数据进行修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执行的过程中不受影响,那么事务之间就需要要相互隔离,这种特性就是隔离性。这就类似于我们在食堂里面打饭的场景,同一个窗口,同一份饭菜,肯定有先来后到,不可能出现两个人同时拿到这份饭菜(假设不存在多个阿姨打饭的情况)。这就隔离开了。

隔离级别分类:

事务具有隔离性,那么如何实现事务之间的隔离?隔离到什么程度?如何保证数据安全的同时也
要兼顾性能?这都是要思考的问题。

事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全方面做了取舍,有
的隔离级别注重并发性,有的注重安全性,有的则是并发和安全适中;在MySQL的InnoDB引擎中事务的隔离级别有四种,分别是:
READ UNCOMMITTED,读未提交 —— 性能最强,但安全性最差。
READCOMMITTED,读已提交 —— 性能稍逊于读未提交,安全性比读未提交高。
REPEATABLE READ,可重复读(InnoDB默认) —— 性能比读已提交差,安全性比读已提交高。
SERIALIZABLE,串行化  —— 性能最差,但安全性最高。

下面就来解释上面四种隔离级别:

READ UNCOMMITED —— 在读取数据时,可以读取到用户正在编辑的数据。这些数据处于事务中,但是还未提交。虽然性能高,但会造成一种现象'脏读'——读取的数据不一定是真实的,可以用户后面会进行修改,再提交。

READ COMMITED —— 和上面的一对比,我们就知道这个是只能读取已经提交的数据。但这还会造成一种现象‘不可重复读’——可能现在这个时刻读取的数据内容是这样的,但是在另外一个时刻读取的数据内容确实另外的。

REPEATABLE READ —— 在出现不可重复读的基础上,进行了改进。既然这些数据在被读取时,可能刷新一下就变样了,那直接把这些数据加上枷锁,那么用户就不能进行修改了。但还会出现另外一个问题,此时用户往这个表中插入了数据,即结果集的条数发生了变化。这种现象叫做‘幻读’。

SERIALIZABLE —— 这个就是和我们学过的队列一样,数据是一次一次的读取。致使其不会出现安全问题,但是效率相比之下就慢很多。

好啦!本期 初始MYSQL数据库(5)—— 事务 的学习之旅就到此结束啦!我们下一期再一起学习吧!

相关文章:

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 事务的概念 事务的ACID特性 使用事务 查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务 事务的隔离性和…...

0基础学习PyTorch——GPU上训练和推理

大纲 创建设备训练推理总结 在《Windows Subsystem for Linux——支持cuda能力》一文中,我们让开发环境支持cuda能力。现在我们要基于《0基础学习PyTorch——时尚分类(Fashion MNIST)训练和推理》,将代码修改成支持cuda的训练和推…...

这款免费工具让你的电脑焕然一新,专业人士都在用

HiBit Uninstaller 采用单一可执行文件的形式,无需复杂的安装过程,用户可以即刻开始使用。这种便捷性使其成为临时使用或紧急情况下的理想选择。尽管体积小巧,但其功能却异常强大,几乎不会对系统性能造成任何负面影响。 这款工具的一大亮点是其多样化的功能。它不仅能够常规卸…...

Java高级Day52-BasicDAO

138.BasicDao 基本说明: DAO:data access object 数据访问对象 这样的通用类,称为 BasicDao,是专门和数据库交互的,即完成对数据库(表)的crud操作 在BasicDao 基础上,实现一张表对应一个Dao,…...

【OceanBase 诊断调优】—— SQL 诊断宝典

视频 OceanBase 数据库 SQL 诊断和优化:https://www.oceanbase.com/video/5900015OB Cloud 云数据库 SQL 诊断与调优的应用实践:https://www.oceanbase.com/video/9000971SQL 优化:https://www.oceanbase.com/video/9000889阅读和管理SQL执行…...

微服务Redis解析部署使用全流程

目录 1、什么是Redis 2、Redis的作用 3、Redis常用的五种基本类型(重要知识点) 4、安装redis 4.1、查询镜像文件【省略】 4.2、拉取镜像文件 4.3、启动redis并设置密码 4.3.1、修改redis密码【可以不修改】 4.3.2、删除密码【坚决不推荐】 5、S…...

C++之STL—常用排序算法

sort (iterator beg, iterator end, _Pred) // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…...

【驱动】地平线X3派:备份与恢复SD卡镜像

1、备份镜像 1.1 安装gparted GParted是硬盘分区软件GNU Parted的GTK+图形界面前端,是GNOME桌面环境的默认分区软件。 GParted可以用于创建、删除、移动分区,调整分区大小,检查、复制分区等操作。可以用于调整分区以安装新操作系统、备份特定分区到另一块硬盘等。 在Ubun…...

【C++报错已解决】std::ios_base::failure

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

matlab入门学习(四)多项式、符号函数、数据统计

一、多项式 %多项式(polynomial)%创建 p[1,2,3,4] %系数向量,按x降幂排列,最右边是常数(x的0次幂) f1poly2str(p,x) %系数向量->好看的字符串 f x^3 2 x^2 3 x 4(不能运算的式子&#xf…...

leetcode621. 任务调度器

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时…...

Spark 的 Skew Join 详解

Skew Join 是 Spark 中为了解决数据倾斜问题而设计的一种优化机制。数据倾斜是指在分布式计算中,由于某些 key 具有大量数据,而其他 key 数据较少,导致某些分区的数据量特别大,造成计算负载不均衡。数据倾斜会导致个别节点出现性能…...

讯飞星火编排创建智能体学习(一)最简单的智能体构建

目录 开篇 智能体的概念 编排创建智能体 创建第一个智能体 ​编辑 大模型节点 测试与调试 开篇 前段时间在华为全联接大会上看到讯飞星火企业级智能体平台的演示,对于拖放的可视化设计非常喜欢,刚开始以为是企业用户才有的,回来之后查…...

mac-m1安装nvm,docker,miniconda

1.安装minicondaMAC OS(M1)安装配置miniconda_mac-mini m1 conda-CSDN博客 2.安装nvm(用第二个方法)Mac电脑安装nvm(node包版本管理工具)-CSDN博客 3.安装docker dmg下载链接docker-toolbox-mac-docker-for-mac安装包下载_开源镜像站-阿里云 教程MacOS系…...

STM32F407之Flash

寄存器分类 一般寄存器分为只读存储器 (ROM) 随机存储器(RAM) 只读存储器 只读存储器也被称为ROM 在正常工作时只能读不能写。 只读存储器经历的阶段 ROM->PROM->EPROM->EEPROM ->Flash 优点:掉电不丢失,解构简单 缺点:只适…...

优化 Go 语言数据打包:性能基准测试与分析

场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上。 原有方案:tcpdump -w 写入文件,然后定时调用 rsync 进行同步。 改造方案:使用 Go 重写这个抓包逻辑及同步逻辑,直接将抓到的包通过网…...

【SQL】未订购的客户

目录 语法 需求 示例 分析 代码 语法 SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field table2.common_field; LEFT JOIN(或称为左外连接)是SQL中的一种连接类型,它用于从两个或多个表中基于连接条件返回左表…...

Qt(9.28)

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {QPushButton *btn1 new QPushButton("登录",this);this->setFixedSize(640,480);btn1->resize(80,40);btn1->move(200,300);btn1->setIcon(QIcon("C:…...

javascript-冒泡排序

前言&#xff1a;好久没学习算法了&#xff0c;今天看了一个视频课&#xff0c;之前掌握很好的冒泡排序居然没写出来&#xff1f; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...

第九届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)

一.题目分析 &#xff08;1&#xff09;.题目 &#xff08;2&#xff09;.题目分析 按键功能分析----存储位置的切换键 a. B1按下切换存储位置&#xff0c;切换后定时时间设定为当前位置存储的时间 b. B2短按切换时分秒高亮&#xff0c;设置完成后&#xff0c;长按把设置的时…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...