码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据库事务——快照读与当前读


    文章目录

    • 快照读与当前读
      • 当前读
      • 快照读
    • RR下快照建立时机探究
      • 1. 快照建立时机——第一次 select 时
      • 2. 快照建立时机——事务启动时
      • 3. 快照建立时机——修改数据时

    快照读与当前读

    当前读

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

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

    • 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 内的修改必须重新建立快照,否则,就会发生丢失更新的问题

  • 相关阅读:
    EhLib VCL v11.0.021 for Delphi Crack
    【MySQL】Mysql事务以及权限管理
    【C语言】用单链表实现一个二进制数加1的运算。
    从零开始,开发一个 Web Office 套件(4):新的问题—— z-index
    PHP 生成微信小程序码,并存储图片
    第13期 | GPTSecurity周报
    Java:学习Java的最好方法
    从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(二)
    【无标题】360压缩软件怎么用?超级好用!
    kitti2bag 安装出现的各种错误
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/126491792
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号