个人技术分享

目录

事务有那些特性

原子性如何实现 

持久性如何实现

隔离性与一致性如何实现


事务有那些特性

事务是由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划分