Mysql 中的行级锁定

2024-01-23

我的表中有 5 行(1 到 5)。我想要第 2 行锁定以进行某些更新,同时如果有人尝试更新第 4 行,那么他应该能够更新。

我正在使用下面的代码尝试此操作,但我觉得它将锁定放在表级别而不是行级别。

------ 第一节

START TRANSACTION;
SELECT * FROM test WHERE t=1 FOR UPDATE;
UPDATE test SET NAME='irfandd' WHERE t=2;
COMMIT;

----- 会话2(被阻止)

START TRANSACTION;
UPDATE test SET NAME='irfandd' WHERE t=4;
COMMIT;

代替FOR UPDATE use LOCK IN SHARE MODE. FOR UPDATE也阻止其他事务读取该行。LOCK IN SHARE MODE允许读取,但阻止更新。

参考:MySQL手册 http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html

------ 第一节

START TRANSACTION;
SELECT * FROM test WHERE t=1 LOCK IN SHARE MODE;
UPDATE test SET NAME='irfandd' WHERE t=2;
COMMIT;

----- 会话 2(不再被阻止:))

START TRANSACTION;
UPDATE test SET NAME='irfandd' WHERE t=4;
COMMIT;

Update:

意识到这一点该表没有索引 on t,我有以下解释:

首先,事务T1锁定row 1 in SELECT * FROM test WHERE t=1 FOR UPDATE

接下来,事务T2尝试执行UPDATE test SET NAME='irfandd' WHERE t=4。要找出受影响的行,需要扫描所有行,包括row 1。但它已被锁定,因此 T2 必须等待 T1 完成。 如果有任何类型的索引,WHERE t=4可以使用索引来决定是否row 1包含t=4或没有,所以不需要等待。

选项1:添加索引test.t这样您的更新就可以使用它。

选项2: use LOCK IN SHARE MODE,仅用于放置读锁。 不幸的是,这个选项会造成僵局。有趣的是,T2 事务执行(更新第 4 行),而 T1 失败(更新第 2 行)。看来T1读锁row 4另外,由于 T2 修改了它,T1 由于事务隔离级别而失败(默认可重复读取 https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html#isolevel_repeatable-read)。最终的解决方案是玩事务隔离级别 https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.html, using READ UNCOMMITTED or READ COMMITTED交易水平。

最简单的是Option 1,恕我直言,但这取决于你的可能性。

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

Mysql 中的行级锁定 的相关文章

  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • MySQL 获取时间优化

    o我有一个包含 200 万个寄存器的表 但它很快就会增长得更多 基本上 该表包含具有相应描述符的图像的兴趣点 当我尝试执行选择在空间上靠近查询点的点的查询时 总执行时间花费太长 更准确地说 持续时间 获取 0 484 秒 27 441 秒
  • 更新\插入数据从grafana到mysql

    可以从grafana更新数据或插入数据到mysql 我需要使用 UI 在 mysql 中插入 更新信息 现在我已经在使用grafana 所以想知道是否有任何方法可以使用grafana来更新或插入信息 没有用于获取用户输入并将该数据插入 My
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • 如何在 MySQL Insert 语句中添加 where 子句?

    这不起作用 INSERT INTO users username password VALUES Jack 123 WHERE id 1 有什么想法如何通过 id 将插入范围缩小到特定行吗 在插入语句中 您不会有现有行来执行 where 语
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • MySQL Workbench 忽略外键

    在处理 MySQL Workbench 中的 SQL 编辑器时 我偶然发现了一些奇怪的事情 其中 执行似乎忽略了外键约束 这是一个例子 create database testdb use testdb create table t1 te
  • 在 MySQL 中插入时检查并防止相似字符串

    简要信息 我有3张桌子 Set id name SetItem set id item id position TempSet id 我有一个函数可以生成新的随机组合Item桌子 基本上 总是在成功生成之后 我在中创建一个新行Set表 获取
  • 如何修改 Amazon RDS 实例的 my.ini 参数

    在启动 MySQL 5 5 RDS 实例时 Amazon 使用默认参数组来配置 my ini 参数 但控制台不允许我修改它们 我怎样才能实现这个目标 例如默认将存储引擎设置为MyISAM或设置字符集 此处记录了这一点 http aws am
  • 如何检查 $row['column_name'] 是否返回空 php mysql

    我有一个带有列的表格 id name phone describe 当我从这个表中获取值时 我正在使用 row mysql fetch array query 现在我想检查是否 row describe 返回空值 如何查看php 您可以使用
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • 如何根据同一个表中的先前数据更新 SQL 表

    我有一张衡量学生表现的表格student在我的数据库中如下 ID TestDate PerformanceStatus PS 1 15 03 2016 0 1 01 04 2016 2 1 05 05 2016 1 1 07 06 2016
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect

随机推荐

  • 如何在 yii 中获取 json 格式(application/json)的响应?

    如何在 yii 中获取 json 格式 application json 的响应 对于 Yii 1 在您的 基础 控制器中创建此函数 Return data to browser as JSON and end application pa
  • 在 Android 中单击按钮时触发后退按钮功能

    我知道 Android 中有后退按钮可以让我们回到之前的表单 但我的团队领导要求在按钮单击时添加后退按钮功能 我怎样才能做到这一点 你应该使用finish 当用户单击按钮以转到上一个活动时 Button backButton Button
  • 使用 Spring 4 注解配置 404 错误页面

    我有一个 Spring MVC 项目 使用 Spring 4 我的服务器是 tomcat 7 我正在尝试制作一个404页面 我尝试了很多方法 但我做不到 我缺少什么 这是 WebAppContext Configuration Compon
  • 将 PNG 图像保存到 WP7 的隔离存储

    这里有很多关于图像到隔离存储的问题 但我找不到适合我的情况的好的答案 所以我们开始吧 我正在取一个 png来自网络的图像 并将其另存为BitmapImage 目的 当它完成加载时 在BitmapImage ImageOpened事件 我想将
  • 是否可以在运行时跳过 Cucumber-JVM 的场景

    我想将标签 skiponchrome 添加到场景中 这应该在使用 Chrome 浏览器运行 Selenium 测试时跳过该场景 这样做的原因是因为某些场景在某些环境中有效 而在其他环境中无效 这甚至可能不是特定于浏览器测试的 并且可以应用于
  • 在 Python 中绘制多个图,但具有偏移范围

    我想绘制 e 和 nu 的函数 其中 e 是偏心率 nu 是真正的异常 我只看椭圆轨道所以0
  • 在C++中使用组合时如何决定类属性应该是指针还是值?

    请参阅此示例 大学的班级有一个主任和很多学生所以我的班级会是这样的 a class University Director d Student list 1000 or b class University Director d Stude
  • 将 pandas 的skipna 全局默认设置设置为 False

    对于某些 Pandas 函数 例如 sum cumsum 和 cumprod 有一个 Skipna 选项 默认设置为 True 这会给我带来问题 因为错误可能会默默地传播 所以我总是明确地将skipna设置为False sum df df
  • 使用 Json.Net 序列化 NameValueCollection 的自定义子类

    我有以下类 但尝试序列化为 Json 失败 class HL7 NameValueCollection public List
  • 角度,将范围传递给函数(将范围作为变量传递?)

    我试图将作用域传递给函数 但似乎无法让它正常工作 这就是我所拥有的 ng click clickFunction scope1 the function scope clickFunction function passedScope pa
  • `tf.set_random_seed()` 相当于种子操作?

    标题几乎说明了一切 你知道是否存在相当于tf set random seed 用于张量流中的操作种子 我试图在定义为两个不同图形的两个精确神经网络处初始化完全相同的权重 所以我想知道是否有一种方法可以为所有操作全局设置操作种子 而不必为每个
  • 将特殊字符作为消息发送;

    我正在运行 Kannel 将其用作 SMS 网关 但我刚刚意识到手机上没有收到应有的一些特殊符号 和 作为三角形发送 我该如何解决这个问题 可能是字符集问题 短信通常使用 GSM7 字符集接收 并且您提供的字符具有不同的 GSM7 数字代码
  • Conda:创建虚拟环境

    我正在尝试创建一个虚拟环境 我已按照两者的步骤进行操作Conda https conda io docs user guide tasks manage environments html and Medium https medium c
  • gulp-mocha 如何传​​递编译器标志?

    我正在尝试使用gulp mocha 模块 https github com sindresorhus gulp mocha但无法找出传递编译器标志的好方法 有没有办法将其包含在我的 gulp 任务中 也许在一个单独的管道中 从命令行运行摩卡
  • RequireJs 优化器忽略插件

    当我使用优化器时 我想忽略 require js 插件的使用 define css styles css 这总是给我这个错误Cannot read property normalize of undefined 我已将此选项设置为需要优化器
  • 您对 C# 缩小有什么建议吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要缩小一些 Silverlight cs 和 xmal 文件中的一些 C 代码 对于维护一个代码库和
  • Java 构建路径

    我有一个关于在代码运行时更改构建路径的快速问题 例如 我有一个类 它从互联网下载 jar 文件 然后将其放入与运行代码相同的目录中 如果可能的话 如何将 jar 加载到构建路径中以访问 jar 文件中的类 一些建议的修改 评论 去除jar
  • 如何判断Windows上是否安装了Java虚拟机?

    使用代码 如何确定 Windows 中是否安装了 Java VM 及其版本 假设您希望通过批处理文件以编程方式确定这一点 您可以使用reg exe工具 安装在windows system32 这个工具的烦人之处在于 无法让它仅返回退出代码
  • 编译curl后路径问题

    我使用以下命令克隆存储库后编译了curl buildconf configure with libssh2 make sudo make install 但是 在 sudo make install 之后 如果 I run curl V 我
  • Mysql 中的行级锁定

    我的表中有 5 行 1 到 5 我想要第 2 行锁定以进行某些更新 同时如果有人尝试更新第 4 行 那么他应该能够更新 我正在使用下面的代码尝试此操作 但我觉得它将锁定放在表级别而不是行级别 第一节 START TRANSACTION SE