sql语法:事务的”那些事“

news2025/6/19 18:15:09

Mysql版本:8.0.26
可视化客户端:sql yog


目录

  • 前言
  • 一、事务是什么?
  • 二、事务的特点
  • 三、如何提交事务和回滚事务?
    • 3.1 手动提交
    • 3.2 自动提交模式下开启事务
    • 3.3 注意事项
  • 四、事务的隔离级别
    • 4.1 模拟事务安全问题
      • 4.1.1 脏读问题模拟如下:
      • 4.1.2 不可重复读问题模拟如下
      • 4.1.3 幻读问题模拟如下


前言

随着人工智能与大数据的不断发展,数据库的管理与维护这门技能也越来越重要,很多人都开启了学习sql语言的相关知识,本文简要介绍了数据库sql语言中的事务部分内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、事务是什么?

👉事务是指一组sql操作,要么起成功后提交,要么一起失败后回滚

例如:

张三账号余额是500,李四账号余额是500。
张三要给李四转账,转100元。
张三的余额减少100,李四的余额要增加100。

👉这两个操作要么一起成功,要么一起失败。

一起成功:
张三账号余额是400,李四账号余额是600

不允许出现:
张三 账号余额是400,李四 账号余额是500

不允许出现:
账号余额是500张三,李四账号余额是600

一起失败:
张三余额500,李四余额500

二、事务的特点

👉1、事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

👉2、事务的ACID属性:

(1)原子性(Automicity原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

举例说明:

在上面的案例中,张三给李四转账的过程中,张三的余额少100,而李四的余额多100,这余额的一赠一减的两个操作时不可再分,即必须一起进行。

(2)一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

举例说明:

在上面的案例中,张三给李四转账的过程中,张三对李四转账的结果有两种:即要么转账失败,要么转账成功。但是不管转账的结果如何,张三和李四的余额总和必须保持不变。
转账成功的话,张三的余额减少100,还剩400,李四的余额增加100,余额为600,他们两个人的钱加起来是1000;转账失败的话,张三和李四的钱都不变,相加之和为1000。

(3)隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

举例说明:

在上面的案例中,无论张三与李四的转账过程中出现什么问题,成也好,败也罢。都不能影响张三对另一个人王五的转账操作

(4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

举例说明:

在上面的案例中,一旦张三转账成功了,李四成功到账,钱就撤不回来了。

三、如何提交事务和回滚事务?

提交事务: COMMIT
回滚事务: ROLLBACK

👉事务回滚是什么意思?

数据库滚回到事务开始时的状态。简单来说,就是当你删除某个表中一行或多行记录后,突然不想删了,回滚一下,刚才删掉的数据又回来了。

测试数据准备如下:

CREATE TABLE `user_profile` (
  `id` int DEFAULT NULL,
  `device_id` int DEFAULT NULL,
  `gender` varchar(14) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `university` varchar(32) DEFAULT NULL,
  `province` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

在这里插入图片描述

举例:删除id为5的记录,尝试回滚

回滚之前:
在这里插入图片描述

代码演示如下:

DELETE FROM user_profile WHERE id=5;
ROLLBACK;

在这里插入图片描述
回滚了,没用!!!

👉原因分析:
mysql中默认事务是自动提交的。 如果需要手动提交和回滚,那么需要设置手动提交模式

要注意,每次操作完之后,要记得手动commit,否则就没有正式的生效。

3.1 手动提交

👉语法:

SET autocommit=FALSE; #设置手动提交模式
#下面的语句仍然是自动提交模式

案例:还是刚才上面的案例需求,删除id为4的记录,尝试回滚

回滚之前:
在这里插入图片描述

代码演示如下:

SET autocommit=FALSE;
DELETE FROM user_profile WHERE id=4;
ROLLBACK;

在这里插入图片描述
在这里插入图片描述

3.2 自动提交模式下开启事务

虽然MySQL默认还是自动提交模式,但是我们可以临时开启一个事务去模拟实现上述操作。

👉语法:

START TRANSACTION;
	这一段sql需要手动处理提交或回滚
ROLLBACK / COMMIT;
下面的语句仍然是自动提交模式

案例:开启事务,删除id为4的记录,尝试回滚

在这里插入图片描述

代码演示如下:

SET autocommit = TRUE;#重新设置为自动提交模式
START TRANSACTION;#开始事务
	DELETE FROM user_profile WHERE id = 4;
ROLLBACK;#回滚
下面的语句仍然是自动提交模式

在这里插入图片描述
在这里插入图片描述

3.3 注意事项

所有的DDL语句,不支持事务。
CREATE ,DROP,TRUNCATE,ALTER 等语句不支持事务
只有 INSERT,UPDATE, DELETE 支持事务。
select不影响数据,所以是否支持事务没什么问题

不信?

案例:开启事务,尝试创建表emp,然后回滚

在这里插入图片描述

代码演示如下:

START TRANSACTION;

CREATE TABLE emp(
     id INT
     );
     
ROLLBACK;

在这里插入图片描述
在这里插入图片描述

备注:
👉删除整个表的数据有两种方式:

  • DELETE FROM 表名称;
  • TRUNCATE 表名称;截断表

👉区别:
(1) delete效率没有truncate高因为delete是一条语一条语句的除的,而truncate是把整个表drop表,新建一张新表。
(2) delete支持事务,而truncate不支持事务


四、事务的隔离级别

👉数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。**一个事务与其他事务隔离的程度称为隔离级别。**数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。

  • 脏读一个事务读取了另一个事务未提交数据;
  • 不可重复读同一个事务中前后两次读取同一条记录不一样。因为被其他事务修改了并且提交了。
  • 幻读一个事务读取了另一个事务新增、删除的记录情况,记录数不一样,像是出现幻觉。

👉MYSQL数据库提供四种事务隔离级别

隔离级别描述
read-uncommitted允许A事务读取其他事务未提交和已提交的数据。会出现脏读、不可重复读、幻读问题
read-committed只允许A事务读取其他事务已提交的数据。可以避免脏读,但仍然会出现不可重复读、幻读问题
repeatable-read确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读。但是幻读问题仍然存在。注意:mysql中使用了MVCC多版本控制技术,在这个级别也可以避免幻读。
serializable确保事务可以从一个表中读取相同的行,相同的记录。在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除操作。所有并发问题都可以避免,但性能十分低下。

👉修改隔离级别语法:

set transaction_isolation=‘隔离级别’;

#mysql8之前 transaction_isolation变量名是 tx_isolation

👉查看隔离级别:

select @@transaction_isolation;

👉说明:

Mysql 默认的事务隔离级别为: REPEATABLE-READ

4.1 模拟事务安全问题

准备测试数据如下:

CREATE TABLE `student` (
  `sid` int NOT NULL,
  `sname` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`sid`),
  CONSTRAINT `student_chk_1` CHECK (((`age` >= 18) and (`age` <= 35)))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

在这里插入图片描述

4.1.1 脏读问题模拟如下:

①修改事务的隔离级别

代码演示如下:

set transaction_isolation='read-uncommitted';
select @@transaction_isolation;

在这里插入图片描述

②客户端2开启事务,在student表中插入一条记录,但不提交。客户端1查询表student的数据

代码演示如下:

START TRANSACTION;

INSERT INTO student VALUES(3,'王五',20);

COMMIT;

SELECT * FROM student;

在这里插入图片描述

4.1.2 不可重复读问题模拟如下

客户端2开启事务,在student表中更新一条记录,提交事务。客户端1查询表student的数据,前后不一致。

代码演示如下:

START TRANSACTION;

UPDATE student SET  sname='xx' WHERE sid=1;

COMMIT;

SELECT * FROM student;

在这里插入图片描述

4.1.3 幻读问题模拟如下

客户端2开启事务,在student表中新插入一条记录,提交事务。客户端1查询表student的数据,记录数量前后不一致。

代码演示如下:

START TRANSACTION;

INSERT INTO student VALUES(4,'jack',30);

COMMIT;

SELECT * FROM student;

在这里插入图片描述


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

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

相关文章

11.Java面向对象----多态

Java面向对象—多态 面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统…

Nacos介绍与安装

文章目录一、什么是Nacos(摘抄自官网介绍)二、Nacos安装2.1 下载安装包2.2 解压2.3 配置端口2.4.启动2.5.访问一、什么是Nacos(摘抄自官网介绍) Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发…

【模型复现】densenet,增加残差结构连接,复用特征图的角度降低了计算量还提升了精度,transition_block压缩特征图

相比ResNet&#xff0c;DenseNet[1608.06993] Densely Connected Convolutional Networks (arxiv.org)提出了一个更激进的密集连接机制&#xff1a;即互相连接所有的层&#xff0c;具体来说就是每个层都会接受其前面所有层作为其额外的输入。下图为DenseNet的密集连接机制。可以…

聚观早报|Uber分拆旗下网约车服务; 字节跳动首度超越腾讯和阿里

今日要闻&#xff1a;Uber分拆旗下网约车服务Careem&#xff1b;字节跳动首度超越腾讯和阿里&#xff1b;搜狗追上GPT-4需要3年左右&#xff1b;苹果首款头戴装置将延至6月量产&#xff1b;全面注册制新规今起正式落地Uber分拆旗下网约车服务Careem Uber 旗下网约车服务 Careem…

【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )

文章目录一、问题提出二、绝对定位 居中设置1、设置固定尺寸2、先偏移50%再回退固定值三、绝对定位元素 水平 / 垂直 居中一、问题提出 绝对定位 不能通过 设置 margin: auto; 样式的方式 , 设置盒子模型水平居中 ; 相对定位 的 盒子模型 , 并没有脱离标准流限制 , 仍然可以使…

notion插件:为你的工作流带来新生

在本文中&#xff0c;我们将介绍Notion的几款有助于提高生产力的插件。这些插件将加强Notion的功能&#xff0c;并为你的工作流程带来更多的便利。 我们特地为你准备了这本漫游指南&#xff1a;收录各种工具、信息和资源&#xff0c;携你共同探索浩瀚美丽的互联网海洋。 snackt…

23种设计模式-抽象工厂模式

抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责创…

数据结构与算法六 树

一 二叉树入门 之前我们实现的符号表中&#xff0c;不难看出&#xff0c;符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n),为了提高运算效率&#xff0c;接下来我们学习树这种数据结构。 1.1 树的基本定义…

流程引擎基础知识

流程引擎基础知识流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repo…

如何使用ChatGPT在1天内完成毕业论文

如何使用ChatGPT在1天内完成毕业论文 几天前&#xff0c;亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文&#xff0c;世道要变&#xff0c;要学会使用黑科技才能混的下去。废话到此结束&#xff0c;下面说明这么用AI生成自己的论文。 使用工具&#xff1a; 1. P…

Maven(一):什么是Maven?

Maven&#xff08;一&#xff09;&#xff1a;什么是Maven&#xff1f;前言一、为什么要学习Maven&#xff1f;1、Maven 作为依赖管理工具1.1 jar 包的规模1.2 jar 包的来源1.3 jar 包之间的依赖关系2、Maven 作为构建管理工具2.1 你没有注意过的构建2.2 脱离 IDE 环境仍需构建…

【ERNIE Bot】百度 | 文心一言初体验

文章目录一、前言二、文心一言介绍三、申请体验⌈文心一言⌋四、⌈文心一言⌋初体验1️⃣聊天对话能力2️⃣文案创作能力3️⃣文字转语音能力✨4️⃣AI绘画能力✨5️⃣数理推理能力6️⃣代码生成能力7️⃣使用技巧说明五、总结一、前言 ​ 最近有关人工智能的热门话题冲上热榜…

亚马逊云科技十七年持续进化,解锁Amazon S3的七项新发布

17年前的3月14日&#xff0c;亚马逊云科技推出了一项“非常简单的”对象存储服务&#xff08;Amazon Simple Storage Service&#xff09;。该服务允许开发人员创建、列出和删除私有存储空间&#xff08;称为存储桶&#xff09;、上传和下载文件以及管理其访问权限。当时&#…

【C#+Unity小白】制作一款简单的2D平台游戏,PONG(弹球)游戏

素材均来自于Brackeys 各位可以到Youtube支持他&#xff0c;他的视频底下有他个人的网站&#xff0c;各位可以从他拿素材。 像我这样的菜鸡&#xff0c;在我看codeMonkey零零散散的制作视频而不知所措时&#xff0c;Brackeys出现了&#xff0c;他耐心教导&#xff0c;他真的是…

【2023最新】超详细图文保姆级教程:App开发新手入门(1)

1. 关于 『YonBuilder移动开发』 PS: 本段内容主要目的是去除官方语音描述&#xff0c;用通俗的语言来简单介绍一下『YonBuilder移动开发』&#xff0c;方便新手开发者判断是否适合自己上手学习。 简介&#xff1a; YonBuilder移动开发平台(官网&#xff1a;https://develope…

2023年14界蓝桥杯省赛“日期统计”题解

问题描述 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …

Python 小型项目大全 41~45

四十一、幸运星 原文&#xff1a;http://inventwithpython.com/bigbookpython/project41.html 在这个碰运气游戏中&#xff0c;你掷骰子来收集星星。你掷得越多&#xff0c;你能得到的星星就越多&#xff0c;但是如果你得到三个头骨&#xff0c;你就失去了一切&#xff01;这款…

【网络编程】UDP

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录&#x1f3ef;一. UDP数据报套接字编程&#x1f3f0;二. 写一个 UDP 版本的 回显服务器-客户端.&#xff08;echo server&#xff09;&#x1f3ed;1. 服务器&#xff1a;&…

咖啡卷到现在,他们开始往里面掺北京豆汁了

咖啡卷到现在&#xff0c;他们开始往里面掺北京豆汁了0. 导读1. 人手一杯&#xff0c;果咖大势所趋2. 双倍成瘾&#xff1a;茶咖和酒咖被重点推荐3. 地方小吃融入咖啡&#xff0c;比如北京豆汁4. 炙手可热的云南咖啡豆5. 咖啡、户外和环保&#xff1a;绑定可持续6. 小结0. 导读…

vue - 【最新】简单快捷的 element ui 组件库的主题色更改,批量统一覆盖替换解决方法,无需npm装包。(适用于新手小白的方法,很简单)

效果图 最新解决方案,简单便捷且不用npm安装任何第三方包就能搞定。 原来的主题色是蓝色 ,可以通过本篇博客提供的方法,统一变成其他主题颜色,比如下面的紫色: 下面就是真实的运行效果,保证可行~ 这样就不用每个组件单独去写样式覆盖颜色了! 定制主