前言
之前讲了索引核心理论,那么今天带来带来另一个重大理论,那就是事务隔离级别机制
一、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
设置
- 设置回话隔离级别
作用域于当前连接的会话
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会生成聚族索引
-
创建版本号
-
删除版本号