Mysql(事务)

Mysql(事务)

  1. 简介

    1. 是什么:一组操作的集合,不分割的工作单位,事务会把所有的操作作为一个整体,向数据库发起操作,要么全部失败要么全部成功。

    2. 案例:

      • 银行转账

        1. 查询A的余额
        2. 减少的A的余额,B的账户增加响应的金额,
        3. 错误情况:若A钱减少的时候B发生一个错误,导致B没有收到钱那么问题就会很严重。可以用事务来防止出现上述的错误,把查询A账户,较少A账户,增加B账户位一个事务,作为一个整体。
      • 事务的流程(默认不开启事务,手动开启提交,回滚事务)

        • 开启事务
        • 回滚事务(抛异常时回滚:临时修改的数据复原)
        • 提交事务
  2. 基本操作

    1. 控制事务方式一:

      1. 查看事务的提交方式:select @@autocommit;通过set指令设置系统变量将提交方式改为手动set @@autocommit=0(0为手动,1为自动)

      2. 提交事务

        commit;

      3. 回滚事务

        rollback

    2. 控制事务方式二:

      1. 开启事务:start transaction 或 begin;
      2. 提交事务:commit;
      3. 回滚事务:rollback;
    3. 案例:

    -- 以store数据库为例建表
    use store;
    -- 数据准备
    create table account(
                            id int auto_increment primary key comment '主键ID',
                            name varchar(10) comment '姓名',
                            money int comment '余额'
    ) comment '账户表';
    
    -- 插入数据
    insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);
    
    -- 恢复数据
    update account set money = 2000 where name = '张三' or name = '李四';
    
    -- 完成转账正常流程
    select * from account where name = "张三";
    update account set money = money - 1000 where name = "张三";
    update account set money = money + 1000 where name = "李四";
    
    -- 模拟转账出现错误的情况
    select * from account where name = "张三";
    update account set money = money - 1000 where name = "张三";
    程序抛出异常...
    update account set money = money + 1000 where name = "李四";
    
    -- 解决方法:控制事务(方法1:)
    select @@autocommit;-- 查看事务提交方式
    set @@autocommit = 0; -- 设置为手动提交
    -- 转账操作 (张三给李四转账1000)
    -- 1. 查询张三账户余额
    select * from account where name = '张三';
    -- 2. 将张三账户余额-1000
    update account set money = money - 1000 where name = '张三';
    程序执行报错 ...
    -- 3. 将李四账户余额+1000
    update account set money = money + 1000 where name = '李四';
    -- 提交事务
    commit;
    -- 回滚事务
    rollback ;
    
    
    -- 方式二
    -- 转账操作 (张三给李四转账1000)
    start transaction ;
    -- 1. 查询张三账户余额
    select * from account where name = '张三';
    -- 2. 将张三账户余额-1000
    update account set money = money - 1000 where name = '张三';
    程序执行报错 ...
    -- 3. 将李四账户余额+1000
    update account set money = money + 1000 where name = '李四';
    -- 提交事务
    commit;
    -- 回滚事务
    rollback;
    
  3. 四大特征

    • 原子性:不可分割的最小单位,要么一起成功,要么一起失败。
    • 一致性:事务完成时,必须使所有的数据都保持一致性。
    • 隔离性:隔离机制,保证事务不在外部并发操作受影响。
    • 持久性:事务一旦提交或者回滚,对数据库中的数据改变就是永久的。C:\ProgramData\MySQL\MySQL Server 8.0\Data每一个数据库对应一个文件夹。
  4. 并发事务

    A,B事务同时操作同一张数据库表时引发的问题

    • 脏度:一个事务读取到另一个事务还没有提交的操作。
    • 不可重复度:一个事务先后读取同一条记录,但是两次读取的数据不同。
    • 幻度:一个事务按条件读取事务没有对应数据,但是在插入数据时又发现存在,好像出现了幻影。
  5. 事务隔离级别(解决并发事务的问题)(数据安全度和性能成反比权衡安全和并发性)

    1. 事务隔离级别

      隔离级别 脏读 不可重复读 幻读
      Read uncommited
      Read commited ×
      Repeatable Read(默认) × ×
      Serializable × × ×
    2. 查看事务隔离级别

      select @@transaction_isolation;

    3. 设置事务隔离级别

      set [session | global] transaction isolation level {read uncommited | read commited | repeatable read | serializable}

    4. 示例

      -- 查看事务隔离级别
      select @@transaction_isolation;
      
      -- 设置事务隔离级别
      set session transaction isolation level read uncommitted ;
      set session transaction isolation level repeatable read ;
      

Mysql(基础——增删改查)

概述sql(ddl,dml,dql,dcl),函数(字符串处理,日期处理,数值,流程控制),约束(主键,非空,默认,检查8.0.16,外键),多表查询(1:1,1:n,n:n,外连接,内连接,子查询),事务(四大特性,并发事务引发的问题)

你可能感兴趣的:(mysql,数据库)