• InnoDB与ACID


    一、事务的基本要素(ACID)

    • A:原子性:从 begin 开始一个事务,直到 commit 或者 rollback,中间执行的DML语句都属于一个整体,要么都commit,要么都rollback。
    • C:一致性:当开始一个事务,没提交前。数据库宕了,这时候恢复的时候就需要把事务回滚。同理,如果提交了,但是内存中的数据没写到磁盘,那么恢复的时候就需要前滚。
    •  I:隔离性:会话1开始了一个事务,会话2开始的事务对于会话1的事务没有影响。同样的,会话1的事务对于会话2的事务没有影响。简单来说,多个事务间互不影响
    • D:持久性:如果一个事务提交了,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失

    二、InnoDB对ACID的实现机制

    2.1 原子性:

      关闭 autocommit 的前提下,需要手动 commit 或 rollback 结束一个事务

      打开 autocommit 的前提下,需要手动 begin 开始一个事务,commit,rollback 结束一个事务

    2.2 一致性:

      崩溃恢复自动处理,无需人工干预。

           dowble write,当出现块损坏。崩溃恢复时,也是自动处理,无需人工干预

    2.3 隔离性:

      REPEATABLE READ隔离级别下有三种锁:行锁,间隙锁,next key 锁,解决了脏读、不可重复读、幻读。隔离性是通过锁实现

    • 脏读:会话1读取数据的时候读到了回话2事务正在进行修改的数据
    • 不可重复读:会话1开始一个事务A,这时候会话1没有提交,执行了一条查询,结果是 abc,会话2执行了事务B,将 abc 修改成 aaa,这时候会话1,又重新执行了那条SQL,发现数据变成 aaa,这就是不可重复读取
    • 幻读:会话1开始一个事务A,这时候会话1没有提交,执行了一条统计,结果是10,这时候会话2执行了事务B,插入了一条数据,这时候会话1,又执行了统计,发现结果是10。

    2.4 持久性:

      持久性方面涉及MySQL软件功能与硬件配置。取决于CPU,网络和存储设备的功能等许多可能性。

    • 是否打开了 dowble write 
    • innodb_flush_log_at_trx_commit、sync_binlog参数的配置
    • 存储设备中写入缓冲区,例如磁盘驱动器,SSD或RAID阵列
    • 存储设备中的电池备份缓存
    • 运行MySQL的操作系统,特别是它对fsync()系统调用的支持
    • 不间断电源(UPS)保护运行MySQL服务器和存储MySQL数据的所有计算机服务器和存储设备的电源
    • 备份策略,例如备份的频率和类型以及备份保留期
    • 分布式或托管数据应用程序,MySQL服务器的硬件所在的数据中心的特定特征,以及数据中心之间的网络连接

    参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/mysql-acid.html

    有异议的朋友可以一起讨论,一致性那块我也是懵逼了。

  • 相关阅读:
    灾后重建
    购物
    [BZOJ3991][SDOI2015]寻宝游戏
    [BZOJ2286][SDOI2011]消耗战
    [Luogu4149][IOI2011]Race
    [BZOJ4003][JLOI2015]城池攻占
    [HDU5765]Bonds
    [HDU5977]Garden of Eden
    [Luogu4331][Baltic2004]数字序列
    [BZOJ4540][HNOI2016]序列
  • 原文地址:https://www.cnblogs.com/ziroro/p/9899132.html
Copyright © 2020-2023  润新知