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

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

 

posted @ 2018-11-02 23:43  Ziroro  阅读(414)  评论(0编辑  收藏  举报