深入理解ACID
2022-08-30 22:46:54 10 举报
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宕机了,那么就造成数据丢失
数据丢失,数据的持久性无法保证<br>
为解决数据丢失,引入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。<br>即使修改小部分数据,都要整页写<br>
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 条评论
下一页