目录
事务有那些特性
原子性如何实现
持久性如何实现
隔离性与一致性如何实现
事务有那些特性
事务是由MySQL的引擎 InnoDB 来实现的
事务的特性 :
原子性 不存在中间状态,要么完成,要么不完成
一致性 事务操作前和操作后,数据满足完整性的约束,数据库保持一致的状态
隔离性 事务与事务之间互不干扰,允许多个并发事务同时对其数据进行读写修改
持久性 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
原子性如何实现
原子性是通过 undo log(回滚日志) 来保证的,那么什么是回滚日志
CREATE TABLE my_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
如上,我创建一张表,表中含有 id 和 name 字段 在 数据存储中如下
每条记录都拥有着隐藏字段,包含事务id 和 undo 指针 (相当于版本链表) 如下
所以 当我们对数据操作成功时,保持在当前的undo指针 ,失败时,回到上一个 undo指针
持久性如何实现
如图
Buffer bool 如何管理缓存 请看MySQL如何改进LRU算法_mysql 改进 lru-CSDN博客
也就是说 redo log 文件是专门记录某个数据页更改了什么,这样即使是系统故障,也能保证数据完整
为什么已经有数据写入磁盘,还要redo log(重做日志)写入磁盘 这样多此一举呢?
写入 redo log(重做日志) 的方式使用了追加操作, 所以磁盘操作是顺序写,
而写入数据需要先找到写入位置,然后才写到磁盘,所以磁盘操作是随机写。
磁盘的「顺序写 」比「随机写」 高效的多,因此 redo log 写入磁盘的开销更小。
为什么是追加操作? 因为磁盘中有专属的Redo log 文件
隔离性与一致性如何实现
隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
一致性则是通过持久性+原子性+隔离性来保证;
MVCC 主要依赖 Read View(快照) 与 undo log(回滚日志实现)
undo log 示意如下:
Read View 示意如下
事务id划分