MySql学习笔记08——事务介绍

事务

基本概念

事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。

一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。

由于只有DML语句中才会有事务的概念,因此事务只和insert update delete语句有关。

说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!

事务是怎么做到多条DML语句同时成功和同时失败的呢?

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

	事务开启了:insertinsertinsertdeleteupdateupdateupdate事务结束了!

在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。在事务的执行过程中,我们可以提交事务,也可以回滚事务。

提交事务&回滚事务

  • 提交事务

    ​ 清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
    ​ 提交事务标志着,事务的结束。并且是一种全部成功的结束。

  • 回滚事务

​ 将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
​ 回滚事务标志着,事务的结束。并且是一种全部失败的结束。

​ 提交事务:commit; 语句
​ 回滚事务:rollback; 语句(回滚永远都是只能回滚到上一次的提交点!)

在MySQL中,默认的事务行为是自动提交的,每次命令成功之后就会进行一次自动提交。

通过执行命令start transaction关闭系统的自动提交。

回滚事务演示:

mysql> select * from t_student;
+----+-----------+------+
| no | name      | cno  |
+----+-----------+------+
|  1 | jack      |  100 |
|  2 | lucy      |  100 |
|  3 | lilei     |  100 |
|  4 | hanmeimei |  100 |
|  5 | zhangsan  |  101 |
|  6 | lisi      |  101 |
|  7 | wangwu    |  101 |
|  8 | zhaoliu   |  101 |
+----+-----------+------+
8 rows in set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.01 sec)mysql> insert into t_student values(9,'ame',100);
Query OK, 1 row affected (0.01 sec)mysql> insert into t_student values(10,'ame',100);
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student values(11,'ame',100);
Query OK, 1 row affected (0.00 sec)mysql> select * from t_student;
+----+-----------+------+
| no | name      | cno  |
+----+-----------+------+
|  1 | jack      |  100 |
|  2 | lucy      |  100 |
|  3 | lilei     |  100 |
|  4 | hanmeimei |  100 |
|  5 | zhangsan  |  101 |
|  6 | lisi      |  101 |
|  7 | wangwu    |  101 |
|  8 | zhaoliu   |  101 |
|  9 | ame       |  100 |
| 10 | ame       |  100 |
| 11 | ame       |  100 |
+----+-----------+------+
11 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.01 sec)mysql> select * from t_student;
+----+-----------+------+
| no | name      | cno  |
+----+-----------+------+
|  1 | jack      |  100 |
|  2 | lucy      |  100 |
|  3 | lilei     |  100 |
|  4 | hanmeimei |  100 |
|  5 | zhangsan  |  101 |
|  6 | lisi      |  101 |
|  7 | wangwu    |  101 |
|  8 | zhaoliu   |  101 |
+----+-----------+------+
8 rows in set (0.00 sec)

提交事务演示:

mysql> create table t_student(-> no int primary key auto_increment,-> name varchar(32)-> );
Query OK, 0 rows affected (0.03 sec)mysql> select * from t_student;
Empty set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t_student values(1,'jack');
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student(name) values('nick');
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student(name) values('nick');
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student(name) values('nick');
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student(name) values('nick');
Query OK, 1 row affected (0.00 sec)mysql> insert into t_student(name) values('nick');
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.01 sec)mysql> select * from t_student;
+----+------+
| no | name |
+----+------+
|  1 | jack |
|  2 | nick |
|  3 | nick |
|  4 | nick |
|  5 | nick |
|  6 | nick |
+----+------+
6 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from t_student;
+----+------+
| no | name |
+----+------+
|  1 | jack |
|  2 | nick |
|  3 | nick |
|  4 | nick |
|  5 | nick |
|  6 | nick |
+----+------+
6 rows in set (0.00 sec)

commit操作实际上是将数据持久化的操作,在进行这个操作之前,仍在事务进行当作,数据仍然可以进行回滚,但是数据持久化之后就不能进行回滚了。

事务的四个特性

  • A : 原子性

    事务是最小的工作单元,不可再分。

  • C: 一致性

​ 所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,保证数据的一致性。

  • I: 隔离性

    不同的事务之间具有隔离,当两个事务想要操作同一张表的时候,他们之间的墙就会产生一定的隔离作用

  • D: 持久性

    事务开始的标志一般是start transaction, 事务最终结束的标志是进行commit操作,对数据进行了持久化,相当于将数据写进硬盘里。

事务的隔离性

事务和事务之间的隔离性具有四个不同的隔离级别:

  • 读未提交 read uncommitted
    • 事务A可以读取到事务B未提交的数据。
    • 但是这种隔离级别会出现脏读现象,我们称读到脏数据
  • 读已提交 read committed
    • 事务A只能读取到事务B已经提交的数据。
    • 不可重复读取数据:在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4,称为不可重复读取。
  • 可重复读 repeatable read (mysql默认的隔离级别)
    • 两个事务对同一张表进行操作,不管对方是怎样操作的,各自只能看到自己事务中所做出的操作,即使事务B提交了,事务A也无法读取事务B修改后的数据。
  • 序列化 serializable(最高的隔离级别)
    • 效率最低,安全级别最高
    • 这种隔离级别表现为事务排队,不能并发,事务A还在操作表1,事务B如果想要对表1进行操作,需要等事务A结束。

验证各种事务隔离级别

查看隔离级别:

查看系统隔离级别:select @@global.tx_isolation;
查看会话隔离级别(5.0以上版本)select @@tx_isolation;
查看会话隔离级别(8.0以上版本)select @@transaction_isolation;
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |  # mysql默认的隔离级别
+-------------------------+

设置隔离级别:

mysql> set global transaction isolation level read uncommitted;
mysql> set global transaction isolation level read committed;
mysql> set global transaction isolation level repeatable read;
mysql> set global transaction isolation level serializable;

设置完后记得重新登陆一下mysql

  • read uncommitted验证

image-20220718140606285

右边事务进行insert后,左边事务是看的见的

  • read committed验证

image-20220718141117168

  • repeatable read验证

image-20220718142107958

右侧事务修改完之后,左侧事务也看不见修改。

  • serializable验证

image-20220718143721244

右边事务在等左边事务commit,才会执行。

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

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

相关文章

【综述+3D】基于NeRF的三维视觉2023年度进展报告(截止2023.06.10)

论文:2003.Representing Scenes as Neural Radiance Fields for View Synthesis 官方网站:https://www.matthewtancik.com/nerf 突破性后续改进: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding | 展示官网&#…

Linux:ansible-playbook配置文件(剧本)

如果你还没有配置基础的ansible和一些基础用法可以去下面的链接 playbook是基于ansible的 Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客 Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客 Linux&…

指针进阶(1)

指针进阶 朋友们,好久不见,这次追秋给大家带来的是内容丰富精彩的指针知识的拓展内容,喜欢的朋友们三连走一波!!! 字符指针 在指针的类型中我们知道有一种指针类型为字符指针 char* ; 使用方法如…

【多线程案例】单例模式(懒汉模式和饿汉模式)

文章目录 1. 什么是单例模式?2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式? 提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊…

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法

不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…

OB Cloud助力泡泡玛特打造新一代分布式抽盒机系统

作为中国潮玩行业的领先者,泡泡玛特凭借 MOLLY、DIMOO、SKULLPANDA 等爆款 IP,以及线上线下全渠道营销收获了千万年轻人的喜爱,会员数达到 2600 多万。2022 年,泡泡玛特实现 46.2 亿元营收,其中线上渠道营收占比 41.8%…

Vue中过滤器如何使用?

过滤器是对即将显示的数据做进⼀步的筛选处理,然后进⾏显示,值得注意的是过滤器并没有改变原来 的数据,只是在原数据的基础上产⽣新的数据。过滤器分全局过滤器和本地过滤器(局部过滤器)。 目录 全局过滤器 本地过滤器…

将虚拟机网络适配器改为仅主机模式,Vmware弹出“仅主机模式适配器驱动程序似乎未运行

这个问题的原因是,主机上缺乏VMware安装后没有VMnet1和VMnet8网卡。 所以

Springboot 实践(13)spring boot 整合RabbitMq

前文讲解了RabbitMQ的下载和安装&#xff0c;此文讲解springboot整合RabbitMq实现消息的发送和消费。 1、创建web project项目&#xff0c;名称为“SpringbootAction-RabbitMQ” 2、修改pom.xml文件&#xff0c;添加amqp使用jar包 <!-- RabbitMQ --> <dependency&g…

EXCEL 中find,if and,if or

接上一篇sql中find函数的作用&#xff0c;由于工作需求是用帆软做报表&#xff0c;他的一些代码不仅有js&#xff0c;sql中的还有一些excel的相关知识&#xff0c;故作整理。 FIND() excel中的find原理和sql中相似&#xff0c;具体可查看 SQL函数 $FIND_Yangshiwei....的博客…

Python,如何安装lap,pip安装lap出现问题

Linux可以&#xff1a; pip install cpython pip install gitgit://github.com/gatagat/lap.gitwindows可以&#xff1a; 下载https://github.com/gatagat/lap 后解压&#xff0c; 安装pip install cpython 安装VS2019企业版&#xff1a; key BF8Y8-GN2QH-T84XB-QVY3B-RC4D…

自动化测试

1. 什么是自动化 1.1 自动化概念 自动化就是解放测试人员双手&#xff0c;测试工作由代码代替人工执行测试工作。 自动化不能完全代替手工测试。 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最…

CSS3常用的新功能总结

CSS3常用的新功能包括圆角、阴渐变、2D变换、3D旋转、动画、viewpor和媒体查询。 圆角、阴影 border-redius 对一个元素实现圆角效果&#xff0c;是通过border-redius完成的。属性为两种方式&#xff1a; 一个属性值&#xff0c;表示设置所有四个角的半径为相同值&#xff…

免费SSL/TLS域名证书Certbot配置详细过程

文章目录 1. 在服务器上安装 Certbot2. 停止 web 服务器3. 运行 certbot 命令4. 证书生成位置5. 配置 web 服务器6. 重新加载 web 服务器7. 验证8. 配置自动续期发现问题1. Problem binding to port 80: Could not bind to IPv4 or IPv6.2. live directory exists for example.…

Clion 使用ffmpeg 学习1 开发环境配置

Clion 使用ffmpeg 学习1 开发环境配置 一、准备工作1. 准备环境2. 下载FFmpeg 二、操作步骤1. Clion 新建一个C项目2. 修改 CMakeLists.txt3. 修改配置4. 运行测试5. 打印rtsp 流信息的 demo 一、准备工作 在视频处理和多媒体应用程序开发中&#xff0c;FFmpeg 是一个强大的开…

数学建模--逻辑回归算法的Python实现

首先感谢CSDN上发布吴恩达的机器学习逻辑回归算法任务的各位大佬. 通过大佬的讲解和代码才勉强学会. 这篇文章也就是简单记录一下过程和代码. CSDN上写有关这类文章的大佬有很多,大家都可以多看一看学习学习. 机器学习方面主要还是过程和方法. 这篇文章只完成了线性可分方面的任…

Promise常用方法笔记

mixin.methods.getList(xxx) 是axios的二次封装 是通过Promise进行基本封装 let a mixin.methods.getList(toosSet.gettype);let b mixin.methods.getList(toosSet.gettypes);let c mixin.methods.getList(toosSet.gettypess);Promise.all([a, b, c]).then((res) > {aler…

音频应用编程

目录 ALSA 概述alsa-lib 简介sound 设备节点alsa-lib 移植编写一个简单地alsa-lib 应用程序一些基本概念打开PCM 设备设置硬件参数读/写数据示例代码之PCM 播放示例代码值PCM 录音 使用异步方式PCM 播放示例-异步方式PCM 录音示例-异步方式 使用poll()函数使用poll I/O 多路复用…

Bridge Champ举办人机对战赛:NFT游戏与传统竞技共生发展编织新格局

概要 现在,NFT与体育竞技正日益紧密地联系在一起。一些体育项目开始推出与赛事或球队相关的NFT,同时也有部分NFT游戏开始举办电子竞技赛事。这种共生发展正在改变体育竞技的生态。 笔者采访了桥牌冠军项目相关负责人,探讨NFT游戏与传统体育竞技的融合潜力。桥牌冠军近期成功举…

postman json复杂数据的模拟

先设置路径 然后可以定义下边数据&#xff08;Key value&#xff09; 也可以不定义 看你的情况 [{"mac": "4C-77-66-19-50-65","addressPattern": "98jd","platform": "ios","registrationId": "…