【MySQL高级篇】08-事务篇

第13章:事务基础知识

#09-事务的基础知识#1.事务的完成过程
#步骤1:开启事务
#步骤2:一系列的DML操作 
#....
#步骤3:事务结束的状态:提交的状态(COMMIT) 、 中止的状态(ROLLBACK)#2. 显式事务#2.1 如何开启? 使用关键字:start transaction  或 begin# start transaction 后面可以跟:read only / read write (默认) / with consistent snapshot #2.2 保存点(savepoint)

13.1 数据库事务概述

13.1.1 存储引擎支持情况

13.1.2 基本概念

13.1.3 事务的ACID特性

13.1.4 事务的状态

13.2 如何使用事务

13.2.1 显式事务

13.2.2 隐式事务

13.2.3 隐式提交数据的情况

#3. 隐式事务# 3.1 关键字:autocommit 
#set autocommit = false;SHOW VARIABLES LIKE 'autocommit';#默认是ONUPDATE account SET balance = balance - 10 WHERE id = 1; #此时这条DML操作是一个独立的事务UPDATE account SET balance = balance + 10 WHERE id = 2; #此时这条DML操作是一个独立的事务#3.2 如何关闭自动提交?
#方式1:
SET autocommit = FALSE; #针对于DML操作是有效的,对DDL操作是无效的。UPDATE account SET balance = balance - 10 WHERE id = 1;UPDATE account SET balance = balance + 10 WHERE id = 2; COMMIT; #或rollback;#方式2:我们在autocommit为true的情况下,使用start transaction 或begin开启事务,那么DML操作就不会自动提交数据START TRANSACTION;UPDATE account SET balance = balance - 10 WHERE id = 1;UPDATE account SET balance = balance + 10 WHERE id = 2; COMMIT; #或rollback;

13.2.4 使用举例1:提交与回滚

#4. 案例分析
#SET autocommit = TRUE; 
#举例1: commit 和 rollbackUSE atguigudb2;
#情况1:
CREATE TABLE user3(NAME VARCHAR(15) PRIMARY KEY);SELECT * FROM user3;BEGIN;
INSERT INTO user3 VALUES('张三'); #此时不会自动提交数据
COMMIT;BEGIN; #开启一个新的事务
INSERT INTO user3 VALUES('李四'); #此时不会自动提交数据
INSERT INTO user3 VALUES('李四'); #受主键的影响,不能添加成功
ROLLBACK;SELECT * FROM user3;#情况2:
TRUNCATE TABLE user3;  #DDL操作会自动提交数据,不受autocommit变量的影响。SELECT * FROM user3;BEGIN;
INSERT INTO user3 VALUES('张三'); #此时不会自动提交数据
COMMIT;INSERT INTO user3 VALUES('李四');# 默认情况下(即autocommit为true),DML操作也会自动提交数据。
INSERT INTO user3 VALUES('李四'); #事务的失败的状态ROLLBACK;SELECT * FROM user3;#情况3:
TRUNCATE TABLE user3;SELECT * FROM user3;SELECT @@completion_type;SET @@completion_type = 1;BEGIN;
INSERT INTO user3 VALUES('张三'); 
COMMIT;SELECT * FROM user3;INSERT INTO user3 VALUES('李四');
INSERT INTO user3 VALUES('李四'); ROLLBACK;SELECT * FROM user3;

13.2.5 使用举例2:测试不支持事务的engine

#举例2:体会INNODB 和 MyISAMCREATE TABLE test1(i INT) ENGINE = INNODB;CREATE TABLE test2(i INT) ENGINE = MYISAM;#针对于innodb表
BEGIN
INSERT INTO test1 VALUES (1);
ROLLBACK;SELECT * FROM test1;#针对于myisam表:不支持事务
BEGIN
INSERT INTO test2 VALUES (1);
ROLLBACK;SELECT * FROM test2;

13.2.6 使用举例3:SAVEPOINT

#举例3:体会savepointCREATE TABLE user3(NAME VARCHAR(15),balance DECIMAL(10,2));BEGIN
INSERT INTO user3(NAME,balance) VALUES('张三',1000);
COMMIT;SELECT * FROM user3;BEGIN;
UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';SAVEPOINT s1;#设置保存点UPDATE user3 SET balance = balance + 1 WHERE NAME = '张三';ROLLBACK TO s1; #回滚到保存点SELECT * FROM user3;ROLLBACK; #回滚操作SELECT * FROM user3;

13.3 事务隔离级别

13.3.1 数据准备

13.3.2 数据并发问题

13.3.3 SQL中的四种隔离级别

13.3.4 MySQL支持的四种隔离级别

13.3.5 如何设置事务的隔离级别

13.3.6 不同隔离级别举例

13.4 事务的常见分类

第14章:MySQL事务日志

14.1 redo日志

14.1.1 为什么需要REDO日志

14.1.2 REDO日志的好处、特点

14.1.2.1 好处

14.1.2.2 特点

14.1.3 redo的组成

14.1.4 redo的整体流程

14.1.5 redo log的刷盘策略

14.1.6 不同刷盘策略演示

14.1.6.1 流程图

14.1.6.2 举例

#10-事务日志USE atguigudb3;CREATE TABLE test_load(
a INT,
b CHAR(80)
)ENGINE=INNODB;#创建存储过程,用于向test_load中添加数据
DELIMITER//
CREATE PROCEDURE p_load(COUNT INT UNSIGNED)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
DECLARE c CHAR(80)DEFAULT REPEAT('a',80);
WHILE s<=COUNT DO
INSERT INTO test_load SELECT NULL,c;
COMMIT;
SET s=s+1;
END WHILE;
END //
DELIMITER;#测试1:
#设置并查看:innodb_flush_log_at_trx_commitSHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';#set GLOBAL innodb_flush_log_at_trx_commit = 1;#调用存储过程
CALL p_load(30000); #1min 28sec#测试2:
TRUNCATE TABLE test_load;SELECT COUNT(*) FROM test_load;SET GLOBAL innodb_flush_log_at_trx_commit = 0;SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';#调用存储过程
CALL p_load(30000); #37.945 sec#测试3:
TRUNCATE TABLE test_load;SELECT COUNT(*) FROM test_load;SET GLOBAL innodb_flush_log_at_trx_commit = 2;SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';#调用存储过程
CALL p_load(30000); #45.173 sec

14.1.7 写入redo log buffer过程

14.1.7.1 补充概念:Mini-Transaction

14.1.7.2 redo日志写入log buffer

14.1.7.3 redo log block的结构图

14.1.8 redo log file

14.1.8.1 相关参数设置

14.1.8.2 日志文件组

14.1.8.3 checkpoint

14.1.9 redo log 小结

14.2 Undo日志

14.2.1 如何理解Undo日志

14.2.2 Undo日志的作用

14.2.3 undo的存储结构

14.2.3.1 回滚段与undo页

14.2.3.2 回滚段与事务

14.2.3.3 回滚段中的数据分类

14.2.4 undo的类型

14.2.5 undo log的生命周期

14.2.5.1 简要生成过程

14.2.5.2 详细生成过程

14.2.5.3 undo log是如何回滚的

14.2.5.4 undo log的删除

14.2.6 小结

第15章:锁

15.1 概述

15.2 MySQL并发事务访问相同记录

15.2.1 读-读情况

15.2.2 写-写情况

15.2.3 读-写或写-读情况

15.2.4 并发问题的解决方案

15.3 锁的不同角度分类

15.3.1 从数据操作的类型划分:读锁、写锁

15.3.2 从数据操作的粒度划分:表级锁、页级锁、行锁

15.3.2.1 表锁(Table Lock)

15.3.2.2 InnoDB中的行锁

15.3.2.3 页锁

15.3.3 从对待锁的态度划分:乐观锁、悲观锁

15.3.3.1 悲观锁(Pessimistic Locking)

15.3.3.2 乐观锁(Optimistic Locking)

15.3.3.3 两种锁的使用场景

15.3.4 按加锁的方式划分:显式锁、隐式锁

15.3.4.1 隐式锁

15.3.4.2 显式锁

15.3.5 其它锁之:全局锁

15.3.6 其它锁之:死锁

15.4 锁的内存结构

15.5 锁监控

15.6 附录

第16章:多版本并发控制

16.1 什么是MVCC

16.2 快照读与当前读

16.2.1 快照读

16.2.2 当前读

16.3 复习

16.3.1 再谈隔离级别

16.3.2 隐藏字段、Undo Log版本链

16.4 MVCC实现原理之ReadView

16.4.1 什么是ReadView

16.4.2 设计思路

16.4.3 ReadView的规则

16.4.4 MVCC整体操作流程

16.5 举例说明

16.5.1 READ COMMITTED隔离级别下

16.5.2 REPEATABLE READ隔离级别下

16.5.3 如何解决幻读

16.6 总结

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

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

相关文章

npm下载慢换国内镜像地址

1 设置淘宝镜像地址 npm config set registry http://registry.npm.taobao.org 2 查看当前下载地址 npm config get registry 3 其它镜像地址列表&#xff1a; 1. 官方镜像&#xff1a;https://registry.npmjs.org/ 2. 淘宝镜像&#xff1a;https://registry.npm.taobao.o…

Linux 基础-查看和设置环境变量

一&#xff0c;查看环境变量 在 Linux中&#xff0c;环境变量是一个很重要的概念。环境变量可以由系统、用户、Shell 以及其他程序来设定&#xff0c;其是保存在变量 PATH 中。环境变量是一个可以被赋值的字符串&#xff0c;赋值范围包括数字、文本、文件名、设备以及其他类型…

图解缓存淘汰算法 LRU、LFU | 最近最少使用、最不经常使用算法 | go语言实现

写在前面 无论是什么系统&#xff0c;在研发的过程中不可避免的会使用到缓存&#xff0c;而缓存一般来说我们不会永久存储&#xff0c;但是缓存的内容是有限的&#xff0c;那么我们如何在有限的内存空间中&#xff0c;尽可能的保留有效的缓存信息呢&#xff1f; 那么我们就可以…

VS2022实现简单控件的缩放

private float X;//当前窗体的宽度private float Y;//当前窗体的高度public Form1(){InitializeComponent();}// 将控件的宽&#xff0c;高&#xff0c;左边距&#xff0c;顶边距和字体大小暂存到tag属性中private void setTag(Control cons){foreach (Control con in cons.Con…

C语言之归并排序

目录 一 简介 二 代码实现 三 时空复杂度 A.时间复杂度&#xff1a; B.空间复杂度&#xff1a; C.总结&#xff1a; 一 简介 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的高效排序算法&#xff0c;其基本思想是将一个大问题分解为若干个规模较小且相…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RowSplit)

将子组件横向布局&#xff0c;并在每个子组件之间插入一根纵向的分割线。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 RowSplit通过分割线限制子组件的宽度。初始化…

数据可视化-ECharts Html项目实战(2)

在之前的文章中&#xff0c;我们学习了如何创建简单的折线图&#xff0c;条形图&#xff0c;柱形图并实现动态触发&#xff0c;最大最小平均值。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下…

11.进程的同步与互斥

11.进程的同步与互斥 计数信号量及其初始化 和王道里面学的PV操作一摸一样,带个count变量,带个阻塞队列 //D:\code\x86\code\start\start\source\kernel\include\ipc\sem.h #ifndef OS_SEM_H #define OS_SEM_H#include "tools/list.h"/*** 进程同步用的计数信号量*…

linux源配置:ubuntu、centos

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

插入排序:一种简单而有效的排序算法

插入排序&#xff1a;一种简单而有效的排序算法 一、什么是插入排序&#xff1f;二、插入排序的步骤三、插入排序的C语言实现四、插入排序的性能分析五、插入排序的优化六、总结 在我们日常生活和工作中&#xff0c;排序是一种非常常见的操作。比如&#xff0c;我们可能需要对一…

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

Golang协程详解

一.协程的引入 1.通过案例文章引入并发,协程概念 见:[go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型&#xff0c;协程资源竞争问题 通过上面文章可以总结出Go并发编程原理: 在一个处理进程中通过关键字 go 启用多个协程&#xff0c;然后在不同的协程中完成不同的子任…

智慧公厕建设的重要性

智慧公厕建设一直被视为提升城市管理水平的重要举措。作为一个关键的城市基础设施&#xff0c;智慧公厕不仅可以改善公共卫生管理&#xff0c;还能提升城市居民的社会民生生活质量。此外&#xff0c;智慧公厕建设还能促进城市的可持续发展&#xff0c;降低能源消耗&#xff0c;…

科研绘图一:箱线图(添加贝赛尔曲线)

R语言绘图系列—箱线图贝赛尔曲线 &#xff08;一&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;添加贝赛尔曲线&#xff09; 文章目录 R语言绘图系列---箱线图贝赛尔曲线&#xff08;一&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;添加贝赛尔曲线&…

数据结构/C++:红黑树

数据结构/C&#xff1a;红黑树 概念实现基本结构插入uncle为红色节点uncle为黑色节点 总代码展示 概念 红黑树是一种二叉搜索树&#xff0c;一般的二叉搜索会发送不平衡现象&#xff0c;导致搜索效率下降&#xff0c;于是学者们开始探索如何让二叉搜索树保持平衡&#xff0c;这…

unity学习(60)——选择角色界面--MapHandler2-MapHandler.cs

1.新建一个脚本&#xff0c;里面有static变量loadingPlayerList using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Assets.Scripts.Model {internal class LoadData{public static List<Pl…

R语言中的常用基础绘图函数 直方图,箱线图,条形图,散点图

目录 R语言中的绘图参数 绘图函数 1.plot函数绘制散点图 2.hist函数绘制直方图 如何修饰直方图? 如何在直方图上标注各组频数&#xff1f; 使用text函数把某些信息标注在直方图上 如何在直方图上添加概率密度曲线&#xff1f; 3.boxplot函数绘制箱线图 4.barplot函数…

JVM虚拟机:通过jconsole远程连接解决JVM报错

本文重点 前面我们介绍过的一些工具都是使用命令行的方式来帮助我们完成&#xff0c;本文我们将使用一种图形化界面的方式来远程连接&#xff0c;然后完成关于JVM的检测任务。 jconsole jconsole是一个JVM的检测工具&#xff0c;这个工具任何安装了Java的电脑上都有的&#…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…

GitHub Actions持续部署

一、概述 1.1Github Action介绍 什么是Github Action ? GitHub Actions是GitHub提供的CI/CD&#xff08;持续集成/持续部署&#xff09;服务。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作&#xff0…