MVCC 如何与 MySql 中的 Lock 配合使用?

2024-05-19

我知道Mysql中使用锁或者MVCC可以实现并发控制,比如可重复读。但我不知道MVCC如何避免幻读。在其他地方了解到一般是通过MVCC和Gap-Lock来实现的,但是目前我理解的是MVCC不需要锁,即更新和删除都是使用undo-log来实现的。如果是的话,MVCC和锁机制是如何协同工作的呢?

例如,为了避免幻读,MVCC 会在 T1 中的某些行上添加间隙锁吗?如果是这样,当 T2 中发生更新时,MVCC 会如何处理,通常只是附加更新撤消日志?或阻止它?


MySQL(特别是 InnoDB)不支持 REPEATABLE-READ 锁定语句。例如,UPDATE, DELETE or SELECT...FOR UPDATE。这些语句始终锁定最近提交的行版本,就好像事务隔离级别是 READ-COMMITTED。

你可以观察到这种情况的发生:

mysql> create table mytable (id int primary key, x int);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into mytable values (1, 42);
Query OK, 1 row affected (0.02 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mytable;
+----+------+
| id | x    |
+----+------+
|  1 |   42 |
+----+------+

到目前为止,一切都很好。现在打开第二个窗口并更新值:

mysql> update mytable set x = 84;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

现在回到第一个窗口,由于 REPEATABLE-READ,非锁定读取仍会查看原始值,但锁定读取会查看最近提交的版本:

mysql> select * from mytable;
+----+------+
| id | x    |
+----+------+
|  1 |   42 |
+----+------+
1 row in set (0.00 sec)

mysql> select * from mytable for update;
+----+------+
| id | x    |
+----+------+
|  1 |   84 |
+----+------+
1 row in set (0.00 sec)

mysql> select * from mytable;
+----+------+
| id | x    |
+----+------+
|  1 |   42 |
+----+------+
1 row in set (0.00 sec)

您可以根据需要来回任意多次,并且同一事务可以返回两个值,具体取决于执行锁定读取还是非锁定读取。

这是 InnoDB 的一个奇怪的行为,但它允许读取不被阻塞。我使用过其他 MVCC 实现,例如 InterBase/Firebird,它们以不同的方式解决了这个问题。它将阻止读取,直到第二个窗口中的事务提交或回滚。如果回滚,那么加锁读就可以读到原来的值。如果其他事务提交,则锁定读取会出错。

InnoDB 在如何实现 MVCC 上做出了不同的选择,以避免阻塞读取。但它会导致奇怪的行为,即锁定读取必须查看最新提交的行版本。

正如歌曲所说,“你不可能总是得到你想要的。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVCC 如何与 MySql 中的 Lock 配合使用? 的相关文章

  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • F#:仅对第一个事件执行一次操作,没有可变性/锁定?

    我有这段代码 可以下载文件并在控制台中告诉我该文件有多大 use webClient new WebClient let lockObj new Object let mutable firstProgressEvent true let

随机推荐

  • PyCharm 表示 readline 导入未被使用

    我有这个代码 while True cmd input gt if cmd exit break 但我想实现高级文本输入功能 例如命令历史记录 因此我导入了 readline 模块 导入 readline 模块 甚至不使用它 将解锁这些功能
  • 如果我的消耗性 IAP 被退款,我会收到任何通知吗?

    我有 Apple iOS 应用程序 其中有很多消耗性 IAP 我非常担心用户购买IAP并使用一段时间后向Apple客服投诉并获得退款 如果我的消耗品 IAP 退款 我会收到任何通知吗 我如何注意到这一点并阻止用户使用 IAP None
  • 如何使用pyinstaller?

    好吧 我是一个完全的编程菜鸟 我正在尝试编译一个我编写的简单程序 该程序接受一个字符串并以莫尔斯电码打印该字符串 它被称为 morse py 我使用安装 pyinstaller pip install pyinstaller 我正在尝试使用
  • file_get_contents 大文件上传

    我正在尝试使用 fsockopen 上传 2GB 以上的大文件 但 file get content 出现以下错误 我无法在内存中存储大文件 我需要分块发送数据 但不知道如何执行此操作 请问有人可以指导我吗 致命错误 允许的内存大小 134
  • ASP .NET:用户控件何时加载?

    MasterPage gt Page gt UserControl 是 ASP NET 请求的加载顺序吗 是否存在 UserControl 在页面加载之前加载的情况 我有给我的用户的私人消息 他们在每个页面上都会看到这样的消息 您有 3 条
  • “引起:java.lang.RuntimeException:视图必须有标签”的实际含义是什么?

    如果知道想要什么标签 请告诉我 Caused by java lang RuntimeException view must have a tag BaseActivity java Override public void setCont
  • 如何像在 localStorage 中一样从 localForage 分配变量?

    请帮我解决以下问题 我一直在将我的 AngularJS 应用程序从 localStorage 转换为 localForage 在我的应用程序中 我像这样分配 localStorage 值 window localStorage setIte
  • 在 Java 中验证 HMAC SHA1 签名

    我想知道如何验证我创建的签名 我创建签名的代码与此类似 HMAC SHA1 如何在 Java 中正确执行此操作 https stackoverflow com questions 6312544 hmac sha1 how to do it
  • highcharts 可点击标签如何转到锚点

    我在 Backbone 应用程序中使用 Highcharts 在柱形图中显示一些信息 我使用图表中的数据标签来允许用户单击并移动到该数据点的详细信息页面 这不是正常的 window location 调用 而应该是 window locat
  • 使用 ifstream 在大文件中查找

    我正在使用 ifstream 在 C 中实现一个程序 该程序必须在大文件 1TB 中查找 然而 读取2GB后就失败了 有没有办法获取文件位置 即使是大文件 我为 32 位 Windows 机器进行编译 std ifstream f f op
  • 解析错误:语法错误,意外的 T_RETURN [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 遇到这个问
  • 如何检查 BOOL 是否为空?

    有没有办法在将值分配给 BOOL 之前检查该值是否为 NULL Nil 例如 我在 NSDictionary 中有一个值可以是 TRUE FALSE NULL mySTUser current user following results
  • 比较 rspec 自定义 ActiveRecord::RecordInvalid 错误消息

    模型中有以下内容 validates uniqueness of title if proc item item item type tag case sensitive false message I18n t errors key va
  • 可以有一个带有可变列的表吗?

    这可能是一个愚蠢的问题 但这里是 是否可以创建一个能够包含具有可变列数和自定义列名称的行的动态表 我浏览过 EAV 建模 但看起来很沉重 现实生活中的例子可能是这样的 假设我有一个客户登记册 但每个客户可能需要输入不同的信息 根据您要输入的
  • 无法解决dll之间的冲突

    我在构建中收到类似于以下内容的警告墙 No way to resolve conflict between Newtonsoft Json Version 7 0 0 0 and Newtonsoft Json Version 6 0 0
  • 将下一个参数作为 String.Format 中的字段宽度

    在 C 中 我有一个想要用于某些字符串的宽度 但直到运行时我才知道该宽度 我正在做这样的事情 string Format 0 digits value prints 123 as 123 是否有一个字符串格式化指令可以让我指定它 而无需像这
  • Powershell v2 远程处理和委派

    我在两台机器上安装了 Powershell V2 并在两台机器上运行 Enable PsRemoting 两台机器都是Win 2003 R2 并且都加入了同一个活动目录域 我可以成功地远程运行命令 所以PS远程处理是在本地服务器和远程服务器
  • 是否可以设置输入文本值的样式?

    我想知道是否可以设置输入框值的样式 such http jsfiddle net aCwhY as
  • 运行maven编译两次

    我正在将 ant 项目迁移到 Maven 这个项目非常不寻常 它使用两个编译步骤和这些编译步骤之间的代码生成步骤 整个构建过程可以描述如下 编译 src 目录中的所有内容 运行内部java工具 将java指向已编译的类和用于编译这些类的ja
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现