zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    【转】Aspose.Cells读取excel文件
    sencha treestore 取消自动加载数据
    百度地图js根据经纬度定位和拖动定位点
    sencha gridpanel checkbox 复选框的勾选 以及和单机行冲突
    c# tcp备忘及networkstream.length此流不支持查找解决
    小程序view排版
    .net+mvc,ueditor
    爬虫BS4—淘女郎
    爬虫手动流程
    python web cgi
  • 原文地址:https://www.cnblogs.com/ziroro/p/9899132.html
Copyright © 2011-2022 走看看