参考资料:

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. SPA路由实现的基本原理

    1. SPA路由实现的基本原理 前端单页应用实现路由的策略有两种,分别是 基于hash 和 基于 History API 基于hash 通过将一个 URL path 用 # Hash 符号拆分.- 浏 ...

  2. Fastjson Sec

    Fastjson 前置知识 autoType功能 序列化:fastjson在通过JSON.toJSONString()将对象转换为字符串的时候,当使用SerializerFeature.WriteCl ...

  3. pat乙级 1019 数字黑洞

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  4. 使用树莓派PICO点灯

    使用树莓派PICO点灯树莓派PICO简介具体步骤方式①下载Thonny软件②为PICO烧录MicroPython固件①下载UF2文件②PICO进入boot模式烧录固件③进行点灯效果总结 具体步骤方式① ...

  5. 第四周作业-N67044-张铭扬

    1. 自定义写出10个定时任务的示例:比如每周三凌晨三点执行data命令要求尽量的覆盖各种场景 1)每天早上8点对磁盘使用率进行查看,若超出空间的80%,则发邮件报警 [root@centos8 ~] ...

  6. Vulnhub:maskcrafter-1.1靶机

    kali:192.168.111.111 靶机:192.168.111.187 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  7. P5318 【深基18.例3】查找文献题解(链式前向星)

    P5318 [深基18.例3]查找文献题解 用head记录这一起点的最后一条边, next记录这一起点的上一条边. 注意要按照参考文献的倒叙排序(要按顺序看,而链式前向星是逆着来的,也就是为什么最简单 ...

  8. Day 24 24.2:逆向分析2 - 完美世界案例

    完美世界逆向分析 url:https://passport.wanmei.com/login?location=L3NhZmUv 定位到正确的断点位置 进行js改写操作 断点代码的关键字:setPub ...

  9. SQL注入、XSS

    参考视频 一.Sql注入的原因 用户输入的信息,拼接到程序中进行了执行. 一.使用Burpsuite,进行万能钥匙探索 二.使用sqlmap进行测试 三.SQL注入基础知识 Mysql 5.x数据结构 ...

  10. AppCrawler自动遍历工具,适用于移动端

    AppCrawler下载链接:https://github.com/seveniruby/AppCrawler,主要用途是回归遍历.原则从中间元素开始遍历 AppCrawler框架引擎 appium ...