• 数据库事务——快照读与当前读


    快照读与当前读

    当前读

    当前读:读取最新提交的数据

    例如下面语句都会按最新提交的数据进行操作:

    • select … for update
    • select ... lock in share mode
    • insert、update、delete

    当前读本质上是基于锁的并发读操作

    快照读

    快照读:读取某一个快照建立时(可以理解为某一时间点)的数据,也称为一致性读

    快照读主要体现在 select 时,而不同隔离级别下,select 的行为不同

    • 在 Serializable (串行化)隔离级别下 - 普通 select 也变成当前读,即加共享读锁

    • 在 RC(读提交) 隔离级别下 - 每次 select 都会建立新的快照

    • 在 RR (可重复读)隔离级别下

      • 事务启动后,首次 select 会建立快照
      • 如果事务启动选择了 with consistent snapshot,事务启动时就建立快照
      • 基于旧数据的修改操作,会重新建立快照

    所以快照读本质上读取的是历史数据(原理是回滚段),属于无锁查询。

    RR下快照建立时机探究

    1. 快照建立时机——第一次 select 时

    tx1tx2
    set session transaction isolation level repeatable read;
    start transaction;
    select * from account; /* 此时建立快照,两个账户为 1000 */
    update account set balance = 2000 where accountNo=1;
    select * from account; /* 两个账户仍为 1000 */

    这里的快照一旦建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000

    如果 tx2 的 update 先执行

    tx1tx2
    set session transaction isolation level repeatable read;
    start transaction;
    update account set balance = 2000 where accountNo=1;
    select * from account; /* 此时建立快照,1号余额已经为2000 */

    2. 快照建立时机——事务启动时

    如果希望事务启动时就建立快照,可以添加 with consistent snapshot 选项

    tx1tx2
    set session transaction isolation level repeatable read;
    start transaction with consistent snapshot; /* 此时建立快照,两个账户为 1000 */
    update account set balance = 2000 where accountNo=1;
    select * from account; /* 两个账户仍为 1000 */

    这里添加了添加 with consistent snapshot 选项,快照就会在事务启动时建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000

    3. 快照建立时机——修改数据时

    tx1tx2
    set session transaction isolation level repeatable read;
    start transaction;
    select * from account; /* 此时建立快照,两个账户为 1000 */
    update account set balance=balance+1000 where accountNo=1;
    update account set balance=balance+1000 where accountNo=1;
    select * from account; /* 1号余额为3000 */

    tx1 内的修改必须重新建立快照,否则,就会发生丢失更新的问题

  • 相关阅读:
    算法2:链表的逆转
    算法-递增三元组
    springboot第55集:思维导图Sharding-JDBC,事务,微服务分布式架构周刊
    从头开始实现一个留言板-README
    SSL证书申请安全审核失败?
    opencv最大值滤波(不局限于图像)
    Linux CentOS 8(网卡的配置与管理)
    scrapy针对302请求的处理与重试配置
    测试开发日记:locust压测带你小试牛刀
    开学哪种电容笔好用?推荐的ipad手写笔
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/126491792