-
ACID
- 原子性
- 定义:每个事务都是不可分割的最小工作单元,事务中的所有操作要么全成功,要么全失败。使用undo log实现回滚。
- 一致性
- 定义:比如A向B转账,A减少1000,B就得增加1000,两人的余额总和不能变。
- 隔离性
- 定义:各个事务之间相互隔离,互不干扰。通过锁和MVCC实现隔离
- 持久性
- 定义:事务一旦提交,数据会永久的存储在数据库中。使用redo log实现故障恢复。
- 原子性
-
实现原理
-
redo log
-
定义: 包含redo log buffer(内存)和redo log file(磁盘),记录事务执行过程中数据修改后物理数据页面的信息。后台线程会将buffer中的数据同步到磁盘。
-
流程图
-
作用
- 当mysql宕机时,如果buffer中还有数据没有同步到磁盘,可通过redo log 进行恢复(所以叫重做日志)。
- 确保事务的持久性
-
什么时候开始写redolog?什么时候释放redolog?
- 当事务开始时就会写redolog
- 当buffer中的数据页同步到磁盘后,redolog就会被释放重用。
-
既然写redolog也有磁盘IO消耗,为什么不直接将数据写入磁盘呢?
- 直接写磁盘是随机IO,写redolog是顺序IO,顺序IO比随机IO性能好。
- 因为mysql加载数据到内存,最小单位是页,所以即使有很小的改动,也会将整页更新,造成大量无效IO。而redolog只包含真正要写入的部分
-
-
undo log
- 定义:记录数据被修改前的信息(记录逆操作),用于回滚操作
- 作用
- 用于回滚事务的操作
- 保证事务的原子性
-
读写锁
- 读锁(共享锁)
- 定义:多个事务可以并发的读同一条数据,但不能同时写同一条数据
- 写锁(排它锁)
- 定义:一个事务拿到写锁之后,其他事务不能读也不能写这条数据
- 读锁(共享锁)
-
MVCC(Multi-Version Concurrency Control)多版本并发控制
-
隐藏字段(mysql在创建表时,会为每张表创建几个隐藏字段)
- row_id:行记录的唯一标志
- transaction_id:事务id
- roll_pointer:回滚指针,指向对应的undo log,用于回滚。
-
作用
- 提高并发性能,不需要加锁,处理读写冲突,利于读多写少的场景
-
原理
- 同一份数据为每个事务生成一个版本(由隐藏字段实现),每个事务只能读特定版本的数据(类似快照)
- 不需要使用锁
- 读与读之间不影响
-
更多精彩请关注公众号(持续更新中)
-