深入理解ACID
2022-08-30 22:46:54 9 举报
AI智能生成
用于面试,记录概要特性
作者其他创作
大纲/内容
总结
A 原子性
一个事务内的SQL语句要么全部执行、要么全部不执行
通过undo log实现
C 一致性
事务执行之后,数据库的完整性没有被破坏,体现在
主键唯一
字段类型、长度符合要求
外键约束符合要求
ACID中其余3种特性都是为了实现一致性,一致性是数据库追求的最终目标
I 隔离性
写写操作
通过锁实现
读写操作
通过MVCC机制实现
D 持久性
通过redo log实现
深入理解
A 原子性
一个事务是不可分割的单位,事务中的SQL要么全成功,要么全失败
通过undo log 实现
原子性体现在回滚上
事务中的某个sql报错,要回滚到执行事务之前的状态
因此要把执行事务之前的状态记录下来
执行回滚
延申类比:迭代上线中,如果发生异常,那么需要回滚,则要找到上线前的版本号并执行回滚
undo log
当事务对数据进行修改,会生成对应的undo log,记录每条sql执行的相关信息
如果事务中某个sql执行异常,则会执行undo log的逆操作进行回滚
I 隔离性
写-写操作
若干事务对同一行数据进行操作,只能有一个事务对数据进行操作
用锁保证
获取到锁的事务能进行操作
其他事务只能等获取到锁的事务执行完或回滚释放锁,才能开始抢锁进而执行事务
读-写操作
通过隔离级别实现,MVCC机制
D 持久性
事务一旦提交,它对数据库的改变是永久性的
通过redo log 实现
redo log背景
MySQL数据存储在磁盘上,每次读取都会有磁盘IO
为提高效率,引入一个Buffer
Buffer包含磁盘中部分数据页,作为访问数据库的一个缓冲
每次读取都先从Buffer读取,没有则去磁盘读,读完则放入Buffer中(读取的单位是页)
每次写入都先向Buffer写,并将Buffer中的数据刷新到磁盘
如果未来得及将Buffer中的数据刷进磁盘,此时MySQL宕机了,那么就造成数据丢失
数据丢失,数据的持久性无法保证
为解决数据丢失,引入redo log
修改数据的数据时,除了要修改Buffer中数据,还要把此次的操作写入redo log
如果MySQL宕机,还能从redo log恢复
redo log是一个预写式日志,它会将所有的修改先写入redo log,再更新到Buffer里面(与先写库再更新缓冲的思想一致)
保证数据不丢失
为什么将数据写入redo log比写入Buffer快
随机IO与顺序IO
Buffer是随机IO写,每次修改数据的位置都是随机的
redo log是顺序IO,文本追加模式。它在文本尾部追加,更快
Buffer以页为单位,redo log只有真正的写入的数据
Buffer以页为单位,MySQL默认一页为16kb。
即使修改小部分数据,都要整页写
即使修改小部分数据,都要整页写
redo log只需写入真正的部分
redo log什么时候同步到磁盘
redo log缓冲区:redo log未同步到磁盘之前都是在redo log缓冲区
即使MySQL宕机,即使事务没有完成,也能通过undo log做回滚操作
redo log持久化操作通过 innodb_flush_log_at_trx_commit
该值 = 0
当事务提交时,不将redo log缓冲区的数据写入磁盘的日志文件,而是等待主线程每秒刷新
该值 = 1
当事务提交时,将redo log缓冲区的数据同步写入磁盘,保证一定写入成功。速度很快,比Buffer快很多
该值 = 2
当事务提交时,将redo log缓冲区的数据异步写入磁盘
0 条评论
下一页