zoukankan      html  css  js  c++  java
  • MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者

    上节回顾


    上两篇记录了我对MySQL 事务 隔离级别read uncommitted 、MySQL 事务隔离级别 read committed+MVCC 的理解。
    这篇记录我对 Repeatable Read 的理解。

    前言


    MySQL在 read committed ,Repeatable Read 两个级别下都会使用到MVCC, 并且只在这两个级别下使用。

    目录


    1.单纯加锁是怎么实现 Repeatable Read 的?
    2.真实的情况是什么样子的?

    1.单纯加锁是怎么实现 Repeatable Read 的


    1.多线程同时更新同一条记录,加X锁。所以并发场景下的 update 是串行执行的。
    2.工业定义上的 select 一条记录,这个时候会在记录上加读共享锁(S锁),并到事务结束,因为在这种情况下才能实现记录在事务时间跨度上的可重复读。在读的时候不允许其他事务修改这条记录。
    3.update 一条语句,这个时候会在记录上加行级排他锁(X锁),并到事务结束,这中场景下,其他读事务会被阻塞。

    2.真实的情况是什么样子的?


    读不影响写,写不影响读。

    1.读不影响写:事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read committed 、Repeatable Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用和等待表上的锁。即采用的是MVCC中一致性非锁定读模式。因读时不加锁,所以不会阻塞其他事物在相同记录上加 X锁来更改这行记录。
    2.写不影响读:事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。

  • 相关阅读:
    Redis随记--pubsub学习
    Redis随记--HyperLogLog的代码学习02
    Redis随记--HyperLogLog的代码学习01
    Redis随记--Lazy Free特性
    Redis随记--StreamID生成
    linux 学习笔记 第一天 安装 分区 指定ip 远程链接 2021-03-04
    Oracle ebs 常用标准表
    EBS开发——经常需要修改的触发器
    查询oracle 数据库 SQL语句执行情况
    Oracle中的索引详解(整理)
  • 原文地址:https://www.cnblogs.com/panxuejun/p/9053762.html
Copyright © 2011-2022 走看看