Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL快照读和当前读用法

MySQL中的快照读和当前读用法

作者:学亮编程手记

快照读不加锁,读事务开始时的数据快照,确保一致性;当前读加锁,读最新数据,用于更新及锁定操作,两者在RC和RR隔离级别下表现不同,MVCC机制支持快照读,而加锁机制保障当前读的数据一致性

在 MySQL 的 InnoDB 存储引擎中,快照读(Snapshot Read)和当前读(Current Read)是两种不同的数据读取方式,它们的主要区别在于是否加锁以及数据一致性。

下面详细介绍这两种读取方式及其应用场景。

快照读(Snapshot Read)

快照读是一种非加锁的读取方式,它读取的是事务开始时的数据快照。

快照读主要用于读取数据的一致性视图,确保在一个事务中多次读取同一数据时结果一致。

特点

  1. 非加锁:快照读不会对数据加锁,因此是非阻塞的。
  2. 一致性视图:读取的是事务开始时的数据快照,不会看到其他事务在此期间对数据的更改。
  3. 多版本并发控制(MVCC):通过 MVCC 机制,快照读可以访问数据的多个版本,确保事务隔离。

应用场景

示例

-- 会话 1
START TRANSACTION;
SELECT * FROM t_user;  -- 快照读,读取事务开始时的数据快照

-- 会话 2
START TRANSACTION;
UPDATE t_user SET age = 35 WHERE name = 'Bob';
COMMIT;

-- 会话 1
SELECT * FROM t_user;  -- 快照读,仍然读取事务开始时的数据快照

当前读(Current Read)

当前读是一种加锁的读取方式,它读取的是数据的最新版本,并且会对读取的数据加锁,以确保其他并发事务不能修改当前记录。

特点

  1. 加锁:当前读会对读取的数据加锁,确保数据的一致性和完整性。
  2. 最新版本:读取的是数据的最新版本,可以看到其他事务已经提交的更改。
  3. 事务隔离:通过加锁机制,确保事务的隔离性。

应用场景

示例

-- 会话 1
START TRANSACTION;
SELECT * FROM t_user WHERE name = 'Bob' FOR UPDATE;  -- 当前读,读取最新版本并加锁

-- 会话 2
START TRANSACTION;
UPDATE t_user SET age = 35 WHERE name = 'Bob';  -- 被会话 1 的锁阻塞
COMMIT;

-- 会话 1
UPDATE t_user SET age = 40 WHERE name = 'Bob';  -- 更新操作,读取最新版本并加锁
COMMIT;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文