• 【宋红康 MySQL数据库 】【高级篇】【16】事务基础知识



    持续学习&持续更新中…

    学习态度:守破离


    数据库事务概述

    在这里插入图片描述

    存储引擎支持情况

    在这里插入图片描述

    基本概念

    在这里插入图片描述

    事务的ACID特性

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    事务的状态

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    如何使用事务

    在这里插入图片描述

    显式事务

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

    在这里插入图片描述

    隐式事务

    在这里插入图片描述

    在这里插入图片描述

    # 3.1 关键字:autocommit 
    #set autocommit = false;
    
    SHOW VARIABLES LIKE 'autocommit';#默认是ON
    
    UPDATE 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    隐式提交数据的情况

    在这里插入图片描述

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

    使用举例1:提交与回滚

    #举例1: commit 和 rollback
    
    USE 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述

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

    #举例2:体会INNODB 和 MyISAM
    
    CREATE 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    使用举例3:SAVEPOINT

    #举例3:体会savepoint
    
    CREATE 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    事务隔离级别

    在这里插入图片描述

    数据准备

    在这里插入图片描述

    数据并发问题

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

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

    补充:

    在这里插入图片描述

    SQL中的四种隔离级别

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    MySQL支持的四种隔离级别

    在这里插入图片描述

    在这里插入图片描述

    如何设置事务的隔离级别

    在这里插入图片描述

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

    事务的常见分类

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

    在这里插入图片描述

    参考

    尚硅谷宋红康: MySQL数据库(入门到高级,菜鸟到大牛).


    本文完,感谢您的关注支持!


  • 相关阅读:
    解决Mac下pycharm不提示element.click()方法
    win 命令替代鼠标的操作
    java中的反射机制
    基于FPGA的图像拉普拉斯变换实现,包括tb测试文件和MATLAB辅助验证
    使用QT操作Excel 表格的常用方法
    Centos7修改主机名hostname
    一份vue面试知识点梳理清单
    数据库连接池
    Mybatis实战练习四【单个条件(动态SQL)&添加数据】
    Unity-mask使用
  • 原文地址:https://blog.csdn.net/weixin_44018671/article/details/121762700