MySql事务以及隔离级别

发布时间 2023-10-10 16:22:32作者: RepublicLine

MySql事务

  • 什么是事务?

    即为一段代码块在执行过程中同时结束并不报错,要么同时成功,要么同时失败

  • 为什么需要事务?

    为了考虑数据的安全性,比如转账时,付款和收款要同时成功

  • 事务怎么使用?

    -- 声明事务
    start transaction;
    sql 1,
    sql 2,
    .....
    commit; -- 提交事务
    
    -- 如果上述代码中有错误则回滚
    rollback;
    
    -- 回滚点,如上述代码 sql1,sql2 如果执行失败回滚需要从 sql1 开始  如果想从别的地方开始可以给 sql语句之间添加回滚点
    -- 如下
    start transaction;
    sql 1,
    sql 2,
    savepoint R1;
    sql 3,
    .....
    commit;
    rollback R1;  -- 回滚后 事务将从 sql 3开始执行
    

MySQL隔离级别

  • 读未提交 产生 : 脏读 ,不可重复读,幻读
  • 读已提交 解决了 脏读 存在:不可重复读 ,幻读
  • 可重复读 解决了 脏读,不可重复读 存在: 幻读
  • 串行化 解决所有
  1. 读未提交 产生问题,脏读 不可重复读 幻读

    A,B同时开启事务 A可以读到 B未提交的数据

    img

​ 如上图,A,B均操作临时库 所产生的数据均从临时库读取,所以有脏读现象

  1. 读已提交 解决了脏读问题 , 读取未提交数据

    A,B同时开启事务 开启事务,相当于创建了一块临时空间,用来存储数据库中的数据

    如果没有提交事务,则该临时空间内修改的数据,仅限于内存中,并不会持久化到数据库中

    img

  2. 可重复读 解决了 不可重复读问题 即为 同一数据,如若A一直提交修改,则B每次读的值不一样

    img

  3. 串行化 解决幻读问题

    什么是幻读,即为上述图,A事务 插入了一条数据student id为1 , 当B也想插入这条数据时,失败 ,但是查询结果为空。即出现了幻觉,这条数据在临时库查不到,但确实持久化到了数据库中

    串行化,就是排队,事务A结束,才能开启事务B