简述数据库中的 ACID 分别是什么?

  • ACID

    • 原子性
      • 定义:每个事务都是不可分割的最小工作单元,事务中的所有操作要么全成功,要么全失败。使用undo log实现回滚。
    • 一致性
      • 定义:比如A向B转账,A减少1000,B就得增加1000,两人的余额总和不能变。
    • 隔离性
      • 定义:各个事务之间相互隔离,互不干扰。通过锁和MVCC实现隔离
    • 持久性
      • 定义:事务一旦提交,数据会永久的存储在数据库中。使用redo log实现故障恢复。
  • 实现原理

    • redo log

      • 定义: 包含redo log buffer(内存)和redo log file(磁盘),记录事务执行过程中数据修改后物理数据页面的信息。后台线程会将buffer中的数据同步到磁盘。

      • 流程图

      • 作用

        • 当mysql宕机时,如果buffer中还有数据没有同步到磁盘,可通过redo log 进行恢复(所以叫重做日志)。
        • 确保事务的持久性
      • 什么时候开始写redolog?什么时候释放redolog?

        • 当事务开始时就会写redolog
        • 当buffer中的数据页同步到磁盘后,redolog就会被释放重用。
      • 既然写redolog也有磁盘IO消耗,为什么不直接将数据写入磁盘呢?

        • 直接写磁盘是随机IO,写redolog是顺序IO,顺序IO比随机IO性能好。
        • 因为mysql加载数据到内存,最小单位是页,所以即使有很小的改动,也会将整页更新,造成大量无效IO。而redolog只包含真正要写入的部分
    • undo log

      • 定义:记录数据被修改前的信息(记录逆操作),用于回滚操作
      • 作用
        • 用于回滚事务的操作
        • 保证事务的原子性
    • 读写锁

      • 读锁(共享锁)
        • 定义:多个事务可以并发的读同一条数据,但不能同时写同一条数据
      • 写锁(排它锁)
        • 定义:一个事务拿到写锁之后,其他事务不能读也不能写这条数据
    • MVCC(Multi-Version Concurrency Control)多版本并发控制

      • 隐藏字段(mysql在创建表时,会为每张表创建几个隐藏字段)

        • row_id:行记录的唯一标志
        • transaction_id:事务id
        • roll_pointer:回滚指针,指向对应的undo log,用于回滚。
      • 作用

        • 提高并发性能,不需要加锁,处理读写冲突,利于读多写少的场景
      • 原理

        • 同一份数据为每个事务生成一个版本(由隐藏字段实现),每个事务只能读特定版本的数据(类似快照)
        • 不需要使用锁
        • 读与读之间不影响

    更多精彩请关注公众号(持续更新中)

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值