前言

之前讲了索引核心理论,那么今天带来带来另一个重大理论,那就是事务隔离级别机制

一、MySQL事务原理分析

1.1、Mysql事务隔离级别

  • 读未提交(READ-UNCOMMITTED)
    • 脏读:并行期间,数据修改都是相互可见的,所以可能读到了还没提交(还没最终确定的数据)
    • 幻读:同一事务中,前后两次读取期间进行了插入操作,最终导致条数不一样。
    • 不可重复读取:并行事务期间,A事物读到了B事物将某个数据修改前修改后不一致的现象
  • 读已提交(READ-COMMITTED)
    • 幻读
    • 不可重复读
  • 可重复读(REPEATABLE_READ)
    • 幻读
  • 串行化

1.2、如何查看事务隔离级别

查看

  • 查看系统隔离级别(8版本)
SELECT @@global.TRANSACTION_isolation
  • 查看会话隔离级别(5版本)
SELECT @@tx_isolation
  • 查看会话隔离级别(8版本)
SELECT @@TRANSACTION_isolation

image

设置

  • 设置回话隔离级别
    作用域于当前连接的会话
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

二、日志

2.1、redo log日志

1、他是innoDB引擎下的一个日志
2、先写日志、再写入磁盘
3、所有修改操作,都会记录。不管食物是否提交都会记录下来。

2.2、undo log日志


2.3、undo log日志

1、保存事务发生之前的数据版本
2、可用于回滚
3、同时提供多版本并发控制下的读(MVVC),也就是非锁定读。

2.4、binlog日志(归档日志)

1、可以做主从复制
2、二进制形式保存
3、数据库还原到某一个时间点的数据
4、提交事务记录binlog,定时刷盘

三、MVCC

3.1、当前读和快照读

  • 当前读
    对读取的数据加一把锁。保证当前读取的数据不被其他事务修改、删除影响,从而达到读取的永远是最新的数据

  • 快照读
    首先保证隔离级别是非串行化,否则变成当前读。他是不加锁情况下的非阻塞的读取

3.2、读视图(read-view)

  • List:装生成read-view时候活跃事务的id集合
  • up limit id:list中最小的事务id
  • low limit id:下一个即将要分配的事务id(不在list集合中)

注意:
可重复读级别:首次快照读时生成快照读
读已提交级别:每次快照读都会生成快照读

3.3、隐式字段

顾名思义,一张表,还有一些你看不见的字段

  • db_trx_id
6个字节
记录创建者条记录时,最后一次修改该记录的事务ID
  • db_roll_ptr
7个字节,回滚指针
记录这条记录的上一个版本(储存在rollback segment回滚段里)
  • db_row_id
6字节,隐藏的自增id(隐藏主键)
如果没有主键,InnoDB会生成聚族索引
  • 创建版本号

  • 删除版本号
    image-1675149365140