mysql 快照 理解_mysql-快照读 vs 当前读

本文详细介绍了MySQL在repeatable read隔离级别下如何利用快照读解决并发事务问题。快照读通过read view实现MVCC,确保在事务中多次读取同一数据的一致性。当前读则包括`SELECT FOR UPDATE`和`SELECT LOCK IN SHARE MODE`,它们会对数据加锁,确保数据的即时状态,并且读锁和写锁之间存在互斥。
摘要由CSDN通过智能技术生成

在 mysql repeatable read 事务隔离级别下 其利用快照读 解决了 non-repeatable-read 的并发事务问题;

read view : https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_read_view

snapshot : https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_snapshot

快照读:

read view : 对于read view 在不同的事务隔离级别下其实现方式并不相同,read view 会在 read uncommitted /read committed / repeatable read 隔离级别下被创建

当前只针对 repeatable-read 隔离级别下 read view 生成策略 (以下使用 rr 表示 repeatable read )

对于启动快照读有两种方式

start transaction with consistent snapshot 会立即创建 read view

在事务启动后 第一次读取操作执行时才创建read view

对于read view 其基于 MVCC consistent read 要求, 在 rr级别下,创建的 read view 是基于整张表的, 里面存储的数据为 每一行的最新已提交事务id(低水位),当前事务开启时其他未提交的事务id(最大的事务id称为高水位);可以通过事务id查询 undo_log 日志来查询历史数据;

对于 rr 可见性控制实现, 主要是针对 同一时间未提交的事务判断,对于在 read view 正式创建前提交的事务是可见的,对于read view 创建后 已提交或未提交的事务都不会影响已创建的read view 数据

当前读:

对于当前读 的操作方式存在一下两种操作

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

select ... for update : 锁的表现形式和 update 语句一样

select ... lock in share mode : 对于当前操作支持 再次读取操作(读锁之间并不互斥,支持重进入),但对于其他事务的更新操作会被阻塞(读锁/写锁之间会互斥),需要等待当前事务提交后才可以执行修改操作

对于以上两种读加锁情况,不能开启自动提交(通过 set autocommit = 0 来关闭自动提交,或设置 set autocommit = 1 ),需要手动开启事务 以及手动提交或回滚事务;

对于 set autcommit = 0 和 set autocommit  = 1 的区别为

set autocommit = 0 模式下,执行任何语句(即使是select)都会开启一个事务,都需要手动 commit 或 rollback

set autocommit = 1 模式下, 必须使用 begin 或 start transaction 来开启事务

对于当前读的理解:

主要是针对更新操作(或具有更新操作特性的操作)而言,对于所有的更新操作(先读(当前读)后写)都需要先读取到当前行数据即时状态的持久化数据(事务已提交的数据),否则就有可能导致当前事务操作覆盖了之前事务的操作

读锁统一的特点为 读锁之间的不会互斥,读锁和写锁之间会互斥

区别点:

对于当前读和快照读的区别在于,当前读 读取当前行数据最新的已提交的事务数据,并不受read view 的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值