开发者

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

目录
  • 快照读(Snapshot Read)
    • 特点
    • 应用场景
    • 示例
  • 当前读(Current Read)
    • 特点
    • 应用场景
    • 示例
  • 总结

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

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

    快照读(Snapshot Read)

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

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

    特点

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

    应用场景

    • 读提交(Read Committed, RC)隔离级别:每次 SELECT 语句都会生成一个新的快照,读取的是当前已提交的数据。
    • 可重复读(Repeatable Read, RR)隔离级别:事务开始时生成一个快照,事务中的所有 SELECT 语句都会使用这个快照,确保事务中多次读取同一数据时结果一致。

    示例

    -- 会话 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;  -- 快照读,仍然读取事务开始时的http://www.devze.com数据快照
    

    当前读(Current Read)

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

    特点

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

    应用场景

    • 读提交(Read Committed, RC)隔离级别:当前读会读取最新的已提交数据。
    • 可重复读(Repeatable Read, RR)隔离级别:当前读会读取最新的已提交数据,并加锁。
    • 更新操作UPDATEDELETEINSERT 等修改数据的操作会触发当前读。
    • 锁定读SELECT ... FOR UPDATESELECT ...编程客栈 LOCK IN SHARE MODE 会触发当前读。

    示例

    -- 会话 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;
    

    总结

    • 快照读:非加锁的读取方式,读取的是事务开始时的数据快照,确保事务中多次读取同一数据时结果一致。
    • 当前读:加锁的读取方式,读取的是数据的最新版本,确保数据的一致性和完整性。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:没有了

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜