• MySQL零基础从入门到精通(事务篇)


    MySQL零基础从入门到精通(事务篇)

    概念

    数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。
    不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
    用户可以根据不同的需求为数据表选择不同的存储引擎

    可以使用 SHOW ENGINES 命令 可以查看Mysql的所有执行引擎我们 可以到 默认的执行引擎是innoDB 支持事务,行级锁定和外键。
    在MySQL中的事务(Transaction)是由存储引擎实现的,在MySQL中,只有InnoDB存储引擎才支持事务。

    事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

    事务用来管理 DDL、DML、DCL 操作,比如 insert,update,delete 语句,默认是自动提交的。

    事务的操作

    1、开启事务:Start Transaction

    任何一条DML语句(insert、update、delete)执行,标志事务的开启
    命令:BEGIN 或 START TRANSACTION

    2、提交事务:Commit Transaction
    成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
    命令:COMMIT

    3、回滚事务:Rollback Transaction
    失败的结束,将所有的DML语句操作历史记录全部清空
    命令:ROLLBACK

    之前的所有SQL操作其实也有事务,只是MySQL自动帮我们完成的,每执行一条SQL时MySQL就帮我们自动提交事务,因此如果想要手动控制事务,则必须关闭MySQL的事务自动提交。

    在MySQL中直接用 SET 来改变 MySQL 的自动提交模式:

    set autocommit=0 -- 禁止自动提交 
    set autocommit=1 -- 开启自动提交 
    
    • 1
    • 2

    示例

    create database if not exists mydb12_transcation;
    use mydb12_transcation;
    -- 创建账户表
    create table account(
        id int primary key, -- 账户id
        name varchar(20), -- 账户名
        money double -- 金额
    );
     
     
    --  插入数据
    insert into account values(1,'zhangsan',1000);
    insert into account values(2,'lisi',1000);
     
     -- 设置MySQL的事务为手动提交(关闭自动提交)
    select @@autocommit;
    set autocommit = 0;
     
    -- 模拟账户转账
    -- 开启事务 
    begin;
    update account set money = money - 200 where name = 'zhangsan';
    update account set money = money + 200 where name = 'lisi';
    -- 提交事务
    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
    • 29
    • 30

    事务特性

    在这里插入图片描述

    事务隔离级别

    Isolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。
    在这里插入图片描述

    读未提交(Read uncommitted)
    一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读。
        
    读已提交(Read committed)
    一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读。

    可重复读(Repeatable read)
    就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生,但是会造成幻读。

    串行(Serializable)
    是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
    Mysql的默认隔离级别是Repeatable read。
    在这里插入图片描述

    设置隔离级别

    -- 查看隔离级别 
    show variables like '%isolation%’; 
    
    -- 设置隔离级别
    /*
    set session transaction isolation level 级别字符串
    级别字符串:read uncommitted、read committed、repeatable read、serializable
    */
    -- 设置read uncommitted
    set session transaction isolation level read uncommitted;
     
    -- 设置read committed
    set session transaction isolation level read committed;
     
    -- 设置repeatable read
    set session transaction isolation level repeatable read;
     
    -- 设置serializable
    set session transaction isolation level serializable;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    【2023年11月第四版教材】第19章《配置与变更管理》(合集篇)
    记录Pytorch中的eval()和no_grad()
    MyBatis 参数传递详解
    利用mybatis框架时,常见的三种sql注入方式
    Swift基础语法 - 可选项
    Diffusion Models视频生成-博客汇总
    WaitForSingleObject等待函数
    18.贪心算法
    js基础知识整理之 —— Date和定时器
    蔚来的长期主义,全靠特斯拉衬托
  • 原文地址:https://blog.csdn.net/zhangzengxiu/article/details/126338202