参考资料:

https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

https://www.yisu.com/zixun/262123.html

1、实验环境

MySQL 5.7

RC隔离级别

共识:非只读事务中,innodb 读取每条记录时都会加锁,RR隔绝级别下不会主动释放行锁,在RC隔离级别下,不符合where条件的记录,会在 Server 层释放行锁。

Using READ COMMITTED has additional effects:

For UPDATE or DELETE statements, InnoDB holds locks only for rows that it updates or deletes. Record locks for nonmatching rows are released after MySQL has evaluated the WHERE condition. This greatly reduces the probability of deadlocks, but they can still happen.

For UPDATE statements, if a row is already locked, InnoDB performs a “semi-consistent” read, returning the latest committed version to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE. If the row matches (must be updated), MySQL reads the row again and this time InnoDB either locks it or waits for a lock on it.

2、插入测试数据

MySQL [ceshi]> create table t1(id int primary key auto_increment,name varchar(200),age int);
MySQL [ceshi]> insert into t1 select null,'a',1; MySQL [ceshi]> insert into t1 select null,'b',2; MySQL [ceshi]> insert into t1 select null,'c',3; MySQL [ceshi]> insert into t1 select null,'d',4; MySQL [ceshi]> insert into t1 select null,'e',5;

3、开始实验

Session1:

开启事务,修改 age=4 这条记录,此时 session1 只会给 age=4 加行锁。

原因:

age 列没有索引,读取数据会全表扫描,innodb 读到的每条记录都会加上行锁, age(1,2,3,5) 这些行并不符合where条件记录,在Innodb 返回数据到Server层的时候,Server层会释放掉这些行锁。

MySQL [ceshi]> begin;
Query OK, 0 rows affected (0.000 sec) MySQL [ceshi]> update t1 set age=44 where age=4;
Query OK, 1 row affected (0.000 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Session2:

删除age=5这条记录,遇到锁等待。

原因:

age 列没有索引,读取数据会全表扫描,innodb 读到的每条记录都会加上行锁,读取 age(1,2,3)这些行都没有问题,因为上边没有行锁,在读到第4行时(age=4)时,因为上边有锁,session2也想为这条记录加锁,所以产生了锁等待,最后锁等待超时。

MySQL [ceshi]> delete from t1 where age=5;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
MySQL [ceshi]> rollback;

session3:

更新age=5这条记录,执行成功。(半一致读的优化)

原因:

前边逻辑和删除age=5流程一样,区别是在读取age=4这条记录时,Innodb会执行半一致读取,读取age=4的最新提交版本(虽然age=4 被修改为 age=5,但因为没有提交,所以它的最新版本还是age=4),以例MySQL可以确定是否符合 where 条件,不匹配,不加锁。

条件匹配,会再次进入innodb层加锁,或锁等待。

MySQL [ceshi]> update t1 set age=55 where age=5;
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MySQL半一致读实验的更多相关文章

  1. Mysql半同步复制模式说明及配置示例 - 运维小结

    MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...

  2. (5.5)mysql高可用系列——MySQL半同步复制(实践)

    关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...

  3. mysql半同步复制问题排查

    1.问题背景      默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则 ...

  4. 004.Heartbeat+HAProxy+MySQL半复制高可用架构

    一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Slave Cen ...

  5. 安装MySQL半同步复制

    一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...

  6. mysql事务隔离级别实验

    一.实验数据: 建表语句: CREATE TABLE `isolation` ( `id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET ut ...

  7. mysql半同步复制跟无损半同步区别

    mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...

  8. Heartbeat+HAProxy+MySQL半复制高可用架构

    目录 一 基础环境 二 架构设计 三 安装MySQL 3.1 安装MySQL 3.2 初始化MySQL 四 配置MySQL半同步 4.1 加载插件 4.2 配置半同步复制 4.3 master创建账号 ...

  9. MySQL半同步复制

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...

  10. MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS[转]

    MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS 简介 目前Mysql高可用的方案有好多,比如MMM,heartbeat+drbd,Cluster等,还有per ...

随机推荐

  1. 中南大学CSU2022-2023级C语言期中考试机试答案

    卡在出线概率了.40%,没想到遍历时反了,我去. 1.时钟加法 1 #include<stdio.h> 2 3 #include<string.h> 4 5 #include& ...

  2. P4525 【模板】自适应辛普森法 1

    \(\text{Solution}\) 题目 \(\text{Simpson}\) 公式: \[\int_l^r f(x) {\mathrm d}x = \frac{(r-l)(f(l)+f(r)+4 ...

  3. 【CTO变形记】整体系统思维-从现象到本质

    前言:我们的⼤脑⾥的认知不是⼀块⽩板,⽽是写满着密密麻麻对这个世界形成的各种观念.信念.塞满了对事物的各个表象,我们脑中的表象世界,对应着外部世界的各种事物. 如果感觉本篇看起来有点不适应,可以看看之 ...

  4. 数位 dp,但是做题笔记

    这玩意儿还要学自己推不出来的 SX 是屑. 数位 dp,顾名思义,是根据数位做 dp,每个数位每个数位转移,炒个例子 windy 数. 求 \([l, r]\),我们改成求 \(1\sim r\) 与 ...

  5. 我有一篇Java Stream使用手册,学了就是你的了!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介 日常编程工作中,Java集合会经常被使用到,且经常需要对集合做一些类似过滤.排序.对象转换之类的操作. 为 ...

  6. 这些 JavaScript 笔试题你能答对几道?

    收藏 javascript-questions 这个仓库很久了,趁着周末来锻炼下自己的 JS 基础水平 因为逐渐也在承担一些面试工作,顺便摘录一些个人觉得比较适合面试的题目和方向 事件流(捕获.冒泡) ...

  7. Mars3D入门示例

    1. 引言 Mars3D是基于Cesium的Web端的三维GIS库,对Cesium做了进一步封装和扩展 Mars3D官网:Mars3D三维可视化平台 | 火星科技 Mars3D开发手册:开发教程 - ...

  8. Cesium之基础控件

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  9. 解决Connecting to 127.0.0.1:8118... failed: Connection refused.

    这里是代理问题的锅 $ env|grep -I proxy http_proxy=http://127.0.0.1:8118 ftp_proxy=http://127.0.0.1:8118 https ...

  10. CF1753C Wish I Knew How to Sort

    正解: 这场我打过,E 题没做出来. 状态:\(dp_i\) 表示前 \(x\) 个有 \(i\) 个 \(0\),剩余步数的期望,\(x\) 为原序列 \(0\) 的个数. 转移:\(dp_i = ...