数据库汇总

SQL

Posted by Ekko on July 10, 2024

[TOC]


当前读、快照读(MVCC)相关点

undolog

在操作数据之前,把需要操作的数据和事务记录备份到undo log中,目的就是为了保证原子性,如果一个事务执行中发生了故障,就可以通过undolog进行回滚

共享锁和排它锁

共享锁(S锁): 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句

如果事务T仅对数据A进行读取,那么会对数据A加上共享锁

之后则其他事务如果要读取数据A的话可以对其继续加共享锁,但是不能加排他锁(也就是无法修改数据)

获准共享锁的事务只能读数据,不能修改数据

排他锁(X锁): 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE

确保不会同时同一资源进行多重更新

如果事务T对数据A要进行修改,则需要对其添加排它锁

加上排他锁后,则其他事务不能再对A加任任何类型的封锁

获准排他锁的事务既能读数据,又能修改数据


mysql当前读

每次读取的都是当前最新的数据

但是读的时候不允许写

写的时候也不允许读

  • Mysql实现当前读是通过共享锁+排他锁+Next-Key Lock实现的
  • 每次对行数据进行读取的时候,加共享锁。此时就不允许修改,但是允许其他事务读取,所以每次都可以读到最新的数据
  • 每次对行数据进行修改的时候,加排他锁,不允许其他事务读取和修改。这种情况下其他事务读取的数据也一定是最新的数据
  • 每次对范围行数据进行读取的时候,对这个范围加一个范围共享锁
  • 每次对范围行数据进行修改的时候,读这个范围加一个范围排它锁

mysql快照读(MVCC)

读写不冲突,每次读取的是快照数据

隔离级别Repeatable Read下(默认隔离级别-可重复读):有可能读取的不是最新的数据

Read Committed隔离级别下:快照读和当前读读取的数据是一样的,都是最新的

  • mysql中的快照读是通过MVCC+undolog实现的
  • 读取快照数据,也就是说当某个数据正在被修改的时候,也可以进行读取该数据,保证读写不冲突
  • 当我们对记录做了变更操作时,就会产生undo记录,undo记录中存储的是老版数据,当一个旧的事务需要读取数据时,为了能够读取到老版本的数据,需要顺着undo列找到满足其可见性的记录,这个找满足可见行的记录依赖。就是说每次都是读取undolog中的数据

MVCC也称多版本并发控制,说的通俗易懂一点就是记录数据的不同版本

实际上,不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,既链表,undo log的链首就是最新的旧记录,链尾就是最早的旧记录

所以快照读都是去读取undolog中链首的最新的旧记录


innodb 主要优势

其DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

行级锁定和 Oracle 风格的一致性读取提高了多用户并发性和性能

InnoDB 表在磁盘上排列数据以优化基于主键的查询。每个 InnoDB 表都有一个称为聚集索引的主键索引,用于组织数据以最大程度地减少主键查找的 I/O。

为了保持数据完整性,InnoDb 支持 FOREIGN KEY 约束。使用外键,会检查插入、更新和删除,以确保它们不会导致相关表之间出现不一致