MVCC简述

一、MVCC

1. MVCC

MVCC(多版本并发控制)是mysql数据库内应对多个事务并发运行的一种方法。在了解什么是MVCC之前首先得要了解快照读当前读

2.当前读和快照读

快照读,指的就是读取的内容是历史版本的数据。
一般触发快照读的语句是:select …
当前读,指的是读取的内容是当前最新的版本数据。
一般触发当前读的语句是:update… , insert… ,delete…, select…for update ,select…lock in share mode

3.Mysql数据库的隔离级别

事务的隔离级别可以分为以下四种:
1.读未提交(read uncommitted)
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;
2.读已提交(read committed)
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;-----不可重复读
3.可重复读(repeatable read)
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;
4.串行化(serializable)
不允许读写并发操作,写执行时,读必须等待
mysql默认的是RR隔离级别,即可重复读。
查看数据库当前隔离级别

select @@transaction_isolation;

修改数据库当前隔离级别

set session transaction isolation level repeatable read;
set session transaction isolation level read commited;

关闭事务自动提交

set autocommit=0;

二、Mysql日志

在Innodb引擎下,mysql有三种日志,分别是:binlog(二进制日志)、redolog(重做日志)、undolog(回滚日志)。
binlog一般用于搭建主从服务器。redolog一般用于在数据库突然崩溃后的数据恢复。undolog用于事务的回滚。

从事务的特性(ACID)来看Mysql日志

关于ACID的具体内容在此不再赘述,可以在其他地方查到,主要说ACID都是由什么来保证的。
1.原子性:undolog(提供回滚日志,保证了原子性)
2.隔离性:MVCC (保证了多个事务间的隔离)
3.持久性:redolog (重做日志,牵扯了一个二阶段提交,具体内容在下面)
4.一致性:前三者共同保证

二阶段提交
所谓的二阶段提交,就是在innodb引擎下,如果数据发生修改,则先修改redo log日志的内容,然后将redo log的状态变为prepare,再在binlog里添加修改记录,如果两个都完成了,commit后就修改数据。(保证提交前数据安全)
在二阶段提交过程中还牵扯一个WAL(write ahead log)(保证提交后数据安全),由于数据库的文件是存在硬盘内的,如果在提交时直接去操作硬盘,由于IO需要的时间很长,容易发生数据丢失的问题。所以,修改并不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

三、数据表的三个隐藏字段

数据表内不单单存储的是数据,还存有三个隐藏的字段。分别是:DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID。
DB_TRX_ID指的是最近修改的事务ID
DB_ROLL_PTR是回滚指针,指向上一个历史版本的数据;
DB_ROW_ID 隐藏主键,在聚簇索引时提到,聚簇索引的首先是选主键,如果没有主键则选择唯一键,如果没有唯一键,则innodb引擎下的数据库会自动创建一个6字节的ROW_ID用来当聚簇索引。
undolog日志在每次有事务进行数据更改的时候,就会修改隐藏字段的值,然后用链表的形式把它们存起来,用于回滚。

四、readview视图与MVCC

事务在进行快照读的时候会创建一个视图。把视图内的值trx_list(活跃事务列表),up_limit_id(最小活跃的事务ID),low_limit_id(系统尚未分配的下一个事务IDDB_TRX_ID进行可见性算法分析。从而达到事务的隔离控制。

五、锁

查看锁的方法:

1.设置
set global innodb_status_output_locks=on;
2.查看
show engine innodb status \G;
上拉到transaction处就可看到

mysql 8.0后可以通过

select * from sys.innodb_lock_waits\G;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值