MySQL半一致读实验
参考资料:
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半一致读实验的更多相关文章
- Mysql半同步复制模式说明及配置示例 - 运维小结
MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...
- (5.5)mysql高可用系列——MySQL半同步复制(实践)
关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...
- mysql半同步复制问题排查
1.问题背景 默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则 ...
- 004.Heartbeat+HAProxy+MySQL半复制高可用架构
一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Slave Cen ...
- 安装MySQL半同步复制
一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...
- mysql事务隔离级别实验
一.实验数据: 建表语句: CREATE TABLE `isolation` ( `id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET ut ...
- mysql半同步复制跟无损半同步区别
mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...
- Heartbeat+HAProxy+MySQL半复制高可用架构
目录 一 基础环境 二 架构设计 三 安装MySQL 3.1 安装MySQL 3.2 初始化MySQL 四 配置MySQL半同步 4.1 加载插件 4.2 配置半同步复制 4.3 master创建账号 ...
- MySQL半同步复制
从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...
- MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS[转]
MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS 简介 目前Mysql高可用的方案有好多,比如MMM,heartbeat+drbd,Cluster等,还有per ...
随机推荐
- appium 在linux安装和使用(持续更新)
appium V1.10 centos7.4 安装 安装步骤 1. 安装node 为了得到npm(node package manager,nodejs的安装包管理工具,可以通过npm来下载appiu ...
- Struts2文件配置介绍
Struts2文件配置介绍 struts2 structs.xml文件配置 标签 package标签 <?xml version="1.0" encoding="U ...
- 【KAWAKO】docker暴力上手
目录 从docker hub拉取镜像 根据镜像创建容器,同时把本地目录挂载到容器 进入容器 停止容器 删除停止的容器 从docker hub拉取镜像 进入docker hub,搜索自己喜欢的镜像. 复 ...
- webgl 系列 —— 初识 WebGL
初识 WebGL 什么是 WebGL webgl 在支持 canvas 的浏览器中进行 2d 或 3d 渲染. webgl 程序除了有 Html.javascript,还需要加入着色器语言(GLSL ...
- Docker安装和卸载(centos)
Docker安装和卸载 一,已安装Docker,卸载Docker 1.方法一 sudo yum remove docker \ docker-client \ docker-client-latest ...
- yarn的基础语法:yarn安装完vue cli3后提示不是内部命令
: 第一步:安装nodejs: 第二步:全局安装vue-cli 解决方案: 全局搜索vue.cmd 将vue.cmd所在的路径添加到环境变量Path后面.再执行vue -V即可.
- go并发实战(读书笔记1)
go并发实战,第一天 大部分本书第一章节是来介绍go语言基础的,其实如果你不是大师,只是一个才起飞的菜鸟,建议不要跳过喔! 为什么不要跳过?因为每个人对语言的认知是不一样的,看看别人是怎么理解一个新事 ...
- pg高可用方案repmgr带witness搭建
一.总体架构 操作系统版本: linux redhat7.6pg版本: 12.2repmgr版本 5.2192.168.3.73 主库: repmgr+master192.168.3.74 从库1: ...
- elasticsearch-8.6.1集群安装部署
elk官方下载地址:https://www.elastic.co/cn/downloads/ 1.创建普通用户及用户组 groupadd elasticsearch useradd elasticse ...
- flannel 关闭SNAT
flannel 关闭SNAT 默认情况下,flannel 访问集群外网络是通过 SNAT 成宿主机 ip 方式,在一些金融客户环境中为了能实现防火墙规则,需要直接针对 POD ip 进行进行规则配置, ...