java面试题(16):Mysql一致性视图是啥时候建立的

news/2024/11/24 11:10:31/

1 演示错误案例

先给大家来一个错误演示。

我们打开两个会话窗口,默认情况下隔离级别是可重复读,我们来看下:

首先在 A 会话中查看当前 user 表,查看完成后开启事务:

 

可以看到id=3的数据sex是男。

接下来在 B 会话中修改 sex:

 

查看修改成功

 

接下来回到A会话查询:

 

可以看到,A 会话的记录也变了。完整测试流程如下:

一致性问题
A会话B会话
select  * from user;
begin;
update user set sex='女' where id = 3;
select * from user;

说好的可重复读呢?

按理说,可重复读就是别的事务对数据的操作不影响当前事务,但是上面这个案例似乎和我们理解的可重复读有出入。

2 分析

不知道小伙伴们是否还记得可重复读的特点:

用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。

从这个角度来说,第一小节的案例似乎也没有问题,因为我们在 A 会话中执行 SELECT 语句多次,查到的结果也都是相同的,sex 都是 女。

但是我们疑惑的是明明 B 会话的事务后开启的,但是我们却在 A 会话中读取到了 B 的修改,这似乎不应该。

这里就涉及到一个问题,事务的一致性视图是何时建立的?

事实上,我们执行的 begin 语句并不是一个事务真正的起点。执行完 begin 之后,接下来执行的第一句 SQL,事务才真正启动。

我们稍微修改一下第一小节的案例:

一致性问题
A会话B会话
select  * from user;
begin;
select * from user;
update user set sex='男' where id = 3;(之前已经改成了女)
select * from user;

A会话结果如下:

 

B会话结果如下:

 

在 A 会话中,事务开启之后,立马先执行一条 SELECT 语句,然后再去 B 会话中做修改,修改完成后再回到 A 会话继续查询,此时发现 B 中的修改对 A 并不可见,这个结果也符合用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。

如果我们想要执行完 begin 之后,就立马开启事务,那么可以通过如下方式来执行:

start transaction with consistent snapshot;

这个 SQL 执行完之后,事务立马就启动了。

接下来,回到第一小节的案例,我们修改一下事务启动的命令:

一致性问题
A会话B会话
select  * from user;

start transaction with consistent snapshot;

update user set sex='女' where id = 3;
select * from user;

此时,A 会话中事务的查询就看不见 B 中的修改了。


http://www.ppmy.cn/news/1036953.html

相关文章

uniapp 小兔鲜儿 - 首页模块(2)

目录 热门推荐 首页 – 热门推荐组件 首页 – 获取热门推荐数据 首页 – 热门推荐数据类型并渲染 猜你喜欢 首页 – 猜你喜欢组件 首页 – 获取猜你喜欢数据 首页 – 猜你喜欢数据类型和渲染 首页 – 猜你喜欢分页准备 首页 – 猜你喜欢分页加载 首页 – 猜你喜欢分…

力扣:63. 不同路径 II(Python3)

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从…

周期 角频率 频率 振幅 初相角

周期 角频率 频率 振幅 初相角 当我们谈论傅里叶级数或波形分析时,以下术语经常出现: 周期 T T T: 函数在其图形上重复的时间或空间的长度。周期的倒数是频率。 频率 f f f: 周期的倒数,即一秒内波形重复的次数。单位通常为赫兹&#xff…

各企业的BCI认证该怎么做?

什么是BCI 良好棉花发展协会(Better Cotton Initiative)简称BCI ,是在2009年注册,总部位于瑞士的日内瓦,是一家全球性的非盈利的国际性会员组织机构,是当前世界上最大的可持续棉花种植项目。BCI致力于与…

poi打印

官网:http://deepoove.com/poi-tl 打印 package com.guodi.bpm.form.service.impl;import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.MapUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.converters.date.DateNumbe…

C++11新特性:auto和decltype关键字

C11新特性:auto和decltype关键字 1、auto1.1 简介1.2 使用情况1.3 使用细则1.3.1 auto与指针和引用结合起来使用1.3.2 在同一行定义多个变量 1.4 auto不能推导的场景 2、decltype3、auto和decltype联合使用 1、auto 1.1 简介 在早期C/C中auto的含义是:使用auto修饰…

mybatis高级特性

文章目录 数据库事务管理批处理插件扩展持久化和ORM缓存机制 数据库事务管理 通过注解方式: 在需要进行事务管理的方法上添加Transactional注解,该注解可以用于类或方法上。在配置文件中开启事务管理器,并指定事务管理器的类型和连接池等相关…

剑指Offer48.最长不含重复字符的子字符串 C++

1、题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字…