抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

事务

  • ACID

    • 原子性

    • 隔离性

    • 一致性

    • 持久性

      • 应对系统崩溃,可以用Redo Log恢复
  • AUTOCOMMIT:MySQL默认采用自动提交,不显示start transaction,每个查询都会被当成一个事务执行并自动提交

并发一致性问题

  • 丢失修改

  • 脏读

  • 不可重复读

  • 幻读

    • insert操作引起

  • 锁粒度

    • 行锁
    • 表锁
  • 锁类型

    • 读写锁

      • 互斥锁(X锁、写锁)
      • 共享锁(S锁、读锁)
      • 一个事务对数据A加了X锁,期间其他事务不能对A加任何锁

一个事务对数据A加了S锁,其他事务可以对A加S锁,但是不能加X锁

- 意向锁

    - 可以更容易支持多粒度加锁
    - IX/IS锁,表示一个事务想要再表中的某个数据行上加X/S锁

        - 一个事务再获得某个数据行的S锁之前,必须先获得表的IS锁或更强的锁
        - 一个事务在获得某个数据行的X锁之前,必须先获得表的IX锁
        - 任意IS/IX锁之间都是兼容的
  • 封锁协议

    • 一级:事务T要修改A时必须加X锁,直到T结束才释放(解决丢失修改问题)
    • 二级:在一级基础上事务T要读取A时必须加S锁,读取完立即释放锁(解决脏读问题)
    • 三级:在二级的基础上,要求读取A时必须加S锁,直到事务结束才释放(解决不可重复读问题)
    • 两段锁协议:加锁和解锁分两个阶段进行,保证可串行化调度

事务隔离级别

  • 读未提交(RU)
  • 读提交(RC)
  • 可重复度(RR)
  • 可串行化(Serializable)

多版本并发控制(MVCC)

  • 版本号

    • 系统版本号SYS_ID:每开启一个新事务时递增
    • 事务版本号TRX_ID:事务开启时的系统版本号
  • ReadView

    • 当前系统未提交的事务列表,以及最大ID和最小ID
  • 快照读:SELECT,不需要进行加锁

  • 当前读:INSERT、UPDATE、DELETE,需要加锁

  • SELECT时可以显式指定加锁

    • select * from table where ? lock in share mode;(S锁)
    • select * from table where ? for update;(X锁)

Next-Key Locks

  • 可重复读级别下,使用MVCC+Next-Key Lock可以解决幻读
  • Record Locks: 锁定一个记录上的索引
  • Gap Locks:锁定索引之间的间隙,但是不包括索引本身

关系数据库

  • 异常

    • 冗余数据、修改异常、删除异常、插入异常
  • 范式

    • 为了解决异常
    • 第一范式:属性不可分割
    • 第二范式:非主属性完全依赖于键码
    • 第三范式:非主属性不传递函数依赖于键码

【参考文章】GitHub-CyC2018/CS-Notes

评论