一、事务的基本要素(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
有异议的朋友可以一起讨论,一致性那块我也是懵逼了。