【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://www.hqwc.cn/news/544650.html

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

相关文章

StarRocks面试题及答案整理,最新面试题

StarRocks 的 MV&#xff08;物化视图&#xff09;机制是如何工作的&#xff1f; StarRocks 的物化视图&#xff08;MV&#xff09;机制通过预先计算和存储数据的聚合结果或者转换结果来提高查询性能。其工作原理如下&#xff1a; 1、数据预处理&#xff1a; 在创建物化视图时…

SpringAI——Java生态接入LLM

最近&#xff0c;Spring官网发布了SpringAI&#xff0c;可点此查看https://spring.io/blog/2024/03/12/spring-ai-0-8-1-released&#xff0c;对于SpringAI的介绍&#xff0c;可看官方文档&#xff1a;https://spring.io/projects/spring-ai#overview。 本文将使用SpringAI配合…

2024 年值得关注的三大 DevOps 趋势

在过去几年中&#xff0c;DevOps 世界以前所未有的速度发展&#xff0c;但它仍然是许多组织效率、创新和数字化转型的主要驱动力。 Google 的 2023 年 加速 DevOps 状态报告显示&#xff0c;公司的软件交付性能质量可以预测组织绩效、团队绩效和员工福祉。 2024年&#xff0c…

【自然语言处理】NLP入门(八):1、正则表达式与Python中的实现(8):正则表达式元字符:.、[]、^、$、*、+、?、{m,n}

文章目录 一、前言二、正则表达式与Python中的实现1、字符串构造2、字符串截取3、字符串格式化输出4、字符转义符5、字符串常用函数6、字符串常用方法7、正则表达式1. .&#xff1a;表示除换行符以外的任意字符2. []&#xff1a;指定字符集3. ^ &#xff1a;匹配行首&#xff0…

Stable Diffusion科普文章【附升级gpt4.0秘笈】

随着人工智能技术的飞速发展&#xff0c;我们越来越多地看到计算机生成的艺术作品出现在我们的生活中。其中&#xff0c;Stable Diffusion作为一种创新的图像生成技术&#xff0c;正在引领一场艺术创作的革命。本文将为您科普Stable Diffusion的相关知识&#xff0c;带您走进这…

第十二届蓝桥杯EDA省赛真题分析

前言&#xff1a; 第十二届蓝桥杯EDA比赛用的是AD软件&#xff0c;从第十四届起都是使用嘉立创EDA专业版&#xff0c;所以在这里我用嘉立创EDA专业版实现题目要求。 一、省赛第一套真题题目 主观题整套题目如下&#xff1a; 试题一&#xff1a;库文件设计&#xff08;5分&am…

双指针、bfs与图论

1238. 日志统计 - AcWing题库 import java.util.*;class PII implements Comparable<PII>{int x, y;public PII(int x, int y){this.x x;this.y y;}public int compareTo(PII o){return Integer.compare(x, o.x);} }public class Main{static int N 100010, D, K;st…

Java高级互联网架构师之路:排查当前JVM错误的步骤

程序 这个程序是有问题的,我们通过一些命令来分析这个程序究竟是哪里出了问题。首先把当前的程序通过SSH工具传输到centos系统中,之后我们就可以在linux环境下编译和执行。 注意一点:上面类的名字是Z,但是在linux环境下,我们将其改为了AA,并且文件名改为了AA,所以文章下…

zookeeper基础学习之六: zookeeper java客户端curator

简介 Curator是Netflix公司开源的一套zookeeper客户端框架&#xff0c;解决了很多Zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt&#xff08;Zookeeper&#xff09;以一句“Guava is to Java…

单片机FLASH深度解析和编程实践(下)

本篇文章将同大家分享单片机FLASH编程的相关寄存器和寄存器操作及库函数操作。本篇文章依然以STM32单片机为例进行解析。有关FLASH的基本原理和实现方法&#xff0c;大家可以参考上一篇文章&#xff1a;单片机FLASH深度解析和编程实践&#xff08;上&#xff09;-CSDN博客 目录…

基于Struts开发物流配送(快递)管理系统

开发工具&#xff1a;EclipseJdkTomcatMySQL数据库

【QT入门】VS2019+QT的开发环境配置

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】什么是qt&#xff0c;发展历史&#xff0c;特征&#xff0c;应用&#xff0c;QtCreator-CSDN博客【QT入门】Windows平台下…