• SQL笔记06


    • 多条语句作为一个整体进行操作, 称为事务

    • 数据库事务确保该范围内的所有的操作都可以全部成功, 或者全部失败.

    • 如果事务失败, 那么执行效果和没有执行这些SQL一样, 不会对数据库有任何改动

    • 数据库事务具有ACID四个特性:

      • A: atomic, 原子性, 将sql作为原子工作单元执行, 要么全部执行, 要么不执行
      • C: consistent, 一致性, 事务完成后所有状态都是一致的, A账户只要减去了100, B账户一定会加上100
      • I: Isolation, 隔离性, 如果有多个事务并发执行, 每个事务作出的修改必须与其他事务隔离
      • D: Duration, 持久性, 事务完成后, 对数据库的修改持久话存储
    • 单条sql: 数据库自动将其作为一个事务执行, 这种事务被称为隐式事务

    • 多条sql语句作为一个事务执行, BEGIN开启事务, COMMIT提交事务, 显式事务

    • COMMIT: 提交事务, 即试图把事务内的所有sql所做的修改永久保存, 如果COMMIT失败了, 所有的sql都会失败

    • ROLLBACK: 回滚事务, 主动让事务失败, 整个事务都会失败

    隔离级别

    • 如果涉及同一条记录的时候, 并发操作可能会发生问题, 引起数据不一致性问题
    • 比如: 赃读, 不可重复读, 幻读等
    • 四种隔离级别, 对应可能出现的数据不一致情况
      • Isolation Level, Dirty Read, No Repeatable Read, Phantom Read
      • Read Uncommitted, yes, yes, yes
      • Read Committed, -, yes, yes
      • Serializable, -, -, -

    Read Uncommitted

    • 隔离级别最低的事务
    • 一个事务可以读到另一个事务更新后, 但未提交的数据.
    • 脏读: 如果另一个事物回滚, 当前事务读到的就是脏数据.
    # 客户端A
    
    mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> BEGIN;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> UPDATE teacher SET name='Bob' WHERE id = 1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> ROLLBACK;
    Query OK, 0 rows affected (0.00 sec)
    
    # 客户端B
    
    mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> BEGIN;
    Query OK, 0 rows affected (0.00 sec)
    
    # 此条数据为脏数据
    mysql> SELECT * FROM teacher WHERE id=1;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    +----+------+
    1 row in set (0.00 sec)
    
    mysql> SELECT * FROM teacher WHERE id=1;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | Alice |
    +----+-------+
    1 row in set (0.00 sec)
    
    mysql> COMMIT;
    

    Read Committed

    • 在此级别的隔离程度下, 一个事务, 可能会遇到 不可重复读 问题 (Non Repeatable Read)
    • 不可重复读: 在一个事务内, 多次读同一数据, 在这个事务还没有结束时, 如果另一个事务恰好修改了这个数据, 那么第一个事务中读到的数据就可能不一致
    • 只能在第一次执行时, 成功复现

    Repeatable Read

    • 此隔离级别下, 可能出现幻读的情况
    • 幻读: 在一个事务中, 第一次读取这个事务不存在, 当试图更新这条数据的时候, 能成功. 并再次查询能够查询到

    Serializable

    • 最高规格的隔离,所有的事务依次进行
    • 不可能出现脏读, 不可重复读, 幻读
    • 事务具有最高的安全性, 但是事务是串行的, 效率会大大下降

    默认隔离级别

    • 没有指定隔离级别, mysql会使用默认隔离级别
    • MySQL中, 如果使用的是InnoDB, 默认的隔离级别是REPEATABLE READ
  • 相关阅读:
    struts2自定义拦截器之过滤不良言论---http500可能的问题所在
    bzoj4205[FJ2015集训] 卡牌配对
    bzoj1562[NOI2009] 变换序列
    bzoj1433[ZJOI2009] 假期的宿舍
    bzoj2150 部落战争
    从bzoj2463到bzoj1443和bzoj2437 博弈+二分图匹配
    bzoj4554[Tjoi2016&Heoi2016] 游戏
    bzoj1059[ZJOI2007] 矩阵游戏
    bzoj1143[CTSC2008] 祭祀river
    bzoj3175[Tjoi2013] 攻击装置
  • 原文地址:https://www.cnblogs.com/zhangrunhao/p/13198208.html
Copyright © 2020-2023  润新知