MySQL:如何实现行级事务锁定而不是表锁定

2024-03-26

这是用例:

我有一张桌子,上面有一堆可用或不可用的唯一代码。作为事务的一部分,我想选择表中可用的代码,然后在事务中更新该行。由于这种情况可能会同时在许多会话中同时发生,因此我希望理想地选择一个随机记录并在表上使用行级锁定,以便其他事务不会被从其中选择行的查询阻塞桌子。

我使用 InnoDB 作为存储引擎,我的查询如下所示:

select * from tbl_codes where available = 1 order by rand() limit 1 for update

然而,它最终不是锁定表中的一行,而是锁定整个表。谁能给我一些关于如何做到这一点的指示,以便此查询不会锁定整个表而只锁定行?

Update

附录:我能够通过在 select 中指定显式键而不是执行 rand() 来实现行级锁定。当我的查询如下所示:

Query 1:

   select * from tbl_codes where available = 1 and id=5 limit 1 for update

Query 2:

   select * from tbl_codes where available = 1 and id=10 limit 1 for update

然而,这并不能真正帮助解决问题。

附录 2:我采用的最终解决方案

鉴于rand()在MySQL中存在一些问题,我选择的策略是:

  1. 我选择 50 个代码 ID(其中可用 = 1),然后对应用程序层中的数组进行洗牌,以向顺序添加一定程度的随机性。

    从 tbl_codes 中选择 id,可用 = 1 限制 50

  2. 我开始循环地从打乱的数组中弹出代码,直到能够选择带有锁的代码

    从 tbl_codes 中选择 *,其中 available = 1 且 id = :id


查看 MySQL 实际执行此查询的方式可能会很有用:

select * from tbl_codes where available = 1 order by rand() limit 1 for update

这将读取并排序所有匹配的行WHERE条件下,使用生成随机数rand()将每一行放入一个虚拟列中,根据该虚拟列对所有行(在临时表中)进行排序,然后从排序集中将行返回给客户端,直到LIMIT已达到(在本例中只有一个)。这FOR UPDATE影响整个语句在执行时完成的锁定,因此在读取行时应用该子句在 InnoDB 中, not当它们返回给客户时。

抛开上述明显的性能影响(这很糟糕),您永远不会从中获得合理的锁定行为。

简短回答:

  1. 选择您想要的行,使用RAND()或您喜欢的任何其他策略,以便找到PRIMARY KEY该行的值。例如。:SELECT id FROM tbl_codes WHERE available = 1 ORDER BY rand() LIMIT 1
  2. 使用其锁定您想要的行PRIMARY KEY仅有的。例如。:SELECT * FROM tbl_codes WHERE id = N

希望这有帮助。

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

MySQL:如何实现行级事务锁定而不是表锁定 的相关文章

  • 未找到教义列:1054“字段列表”中未知列“s.features”

    我在站点表中添加了一个新列 features 并使用 Doctrine 重新生成了模型 此代码导致错误 siteTable Doctrine Core getTable Site site siteTable gt findOneByNam
  • MySQL 全文搜索之谜

    我们的网站上有一个使用 MySQL 全文搜索的简单搜索 但由于某种原因 它似乎没有返回正确的结果 我不知道这是否是 Amazon RDS 我们的数据库服务器所在的位置 或我们请求的查询的某种问题 这是数据库表的结构 CREATE TABLE
  • 如何将值从 android 传递到 php Web 服务并检索它?

    我正在尝试将一个值传递给我的 php web 服务 我已经使用此代码来传递 名称 值 private class MyAsyncTask extends AsyncTask
  • ER_NOT_SUPPORTED_AUTH_MODE:客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端

    Nodejs中使用mysql的问题 const mysql require mysql var connection mysql createConnection host localhost user root password 1234
  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • 从 varchar(100) 类型获取时间(HH:MM AM/PM)格式

    如何将字符串 RD OT 07 30 转换为时间 我只知道如何将 07 30 AM 转换为时间 下面的代码给了我一个空白数据 id strtoupper POST id query mysql query SELECT STR TO DAT
  • MySQL - 查询合并具有相同 id 的行并保留该 id 的所有条目但作为一条记录

    我一直在处理本地保存在 wamp 服务器上的 mysql 数据库中的表 我正在使用 wamp 中的 phpmyadmin 区域来运行查询 我正在尝试获取数据来执行以下操作 谁能帮我制作一张包含许多植物记录的表格 植物可以有多个名称 表格将其
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • 如何在php中正确显示另一种语言的mysql表数据

    我有一个 mySQL 表 其中一列中的数据采用英语以外的语言 波斯语 当我在表中输入数据时 它会正确显示 但是当我想在 php 文件中显示数据时 它会显示如下 好吧 我应该怎么做才能以正确的形式显示数据 由于我经常使用 非英语 字符 因此要
  • 使用 cfchart 标签在单个饼图中显示多个查询的数据

    请考虑以下代码 现在我的代码中有以下代码 cfm页面内的 tag DataSource xx xx x xx Name of the database sgemail Name of the relevant column event vc
  • Mac OS X Yosemite/El Capitan 上自动启动 MySQL 服务器

    我想在启动时自动启动 MySQL 服务器 这在小牛队是可能的 但在优胜美地似乎不起作用 edit 似乎这也适用于 El Capitan dcc 非常接近 这是 MySQL 在 Yosemite 上再次自动启动的方式 The com mysq
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht

随机推荐

  • Linux Xwindow 转发上的 Visual Studio Code

    我的配置如下 OS DISTRIB ID Ubuntu DISTRIB RELEASE 14 04 DISTRIB CODENAME trusty DISTRIB DESCRIPTION Ubuntu 14 04 4 LTS NAME Ub
  • 更新 my.cnf 中的变量

    I set lower case table names 2在 my cnf 文件中 设置变量后 我重新启动了 mysql 服务器 但当我使用时 该值仍然是 0SHOW VARIABLES 我正在使用 MySQL 5 5 任何想法还需要做什
  • HTML:阻止子元素继承父元素的 [title] 属性

    问题是 当我为 wrapper 元素声明标题属性时 当光标落入 content 元素内时 也会显示工具提示 如何防止这种情况 继承 发生 div title example div div div 我只想显示工具提示between cont
  • 如何使用 gradle 任务解析 .json 文件并从中获取 json 数据?

    有没有一种方法可以在 gradle 任务的帮助下解析 xyz json 文件并获取其中的所有单独的 json 数据 例如 我想解析存储在我的资产文件夹中的 xyz json 文件中的数据并获取其中的所有值 例如 获取 类型 的值 type
  • 在CSS中创建凹角[重复]

    这个问题在这里已经有答案了 是否可以在CSS中创建这样的凹角 如果是 你会怎么做 莉亚 维鲁有一个如何执行此操作的描述 http lea verou me 2011 03 beveled corners negative border ra
  • 使用 jQuery getJSON 时 JSON Feed 返回 null

    http portlandonline com shared cfm json cfm c 27321 http portlandonline com shared cfm json cfm c 27321 它返回 null 我真的无权接触
  • 匿名委托中捕获的私有字段

    class A public event EventHandler AEvent class B private A foo private int bar public void AttachToAEvent foo AEvent del
  • 数据工厂子项修改或创建日期

    我有一个数据工厂 V2 管道 由 获取元数据 和 forEach 活动组成 用于读取文件共享 本地 上的文件列表并将其记录在数据库表中 目前 我只能读取文件名 但还想检索每个文件的修改日期和 或创建日期属性 有什么帮助吗 谢谢 Accord
  • 使用SQL计算时间序列中的时间间隔

    我有一个像这样的 MySQL 表 CREATE TABLE IF NOT EXISTS vals DT datetime NOT NULL value INT 11 NOT NULL PRIMARY KEY DT DT 是唯一的日期和时间
  • iOS 自定义字体已移位

    对于一个项目我买了一个OTF字体并将其包含到我的项目中 添加到 plist 文件等 它有效 我可以在按钮上设置字体 但标签会被替换 我添加了屏幕截图 以便您可以看到我的问题 有人知道问题出在哪里吗 系统 iPad 3 iOS 6 0 bet
  • 有什么办法可以提取底层Xaml吗?

    无论如何 是否可以从控件中提取底层 xaml IE 我有一个名为 fooBox 的文本框 我可以在运行时从文本框获取代表文本框的 xaml 吗 这向您展示了完整的生命周期 从控件到 XAML 再到控件 如你看到的 string s Xaml
  • 有保证的方法可以在运行时获取成员字段的源顺序吗?

    我正在寻找一种按源顺序检索 在运行时 类的字段的方法 以便我可以执行自己的 初始化处理 该处理基于声明的顺序 我知道 Javadoc 用于Class getDeclaredFields 明确指出不保证订单 SO 上的一些答案指向Javass
  • iOS7中选择单元格时UITableView分隔线消失

    在我的 tableView 中 我在单元格之间设置了分隔线 我允许选择多个单元格 这是我设置选定单元格背景颜色的代码 UIView cellBackgroundColorView UIView alloc initWithFrame cel
  • 如何从没有 jenkinsfile 的存储库触发 Jenkins 管道构建?

    我有一个不包含詹金斯文件 https jenkins io doc book pipeline jenkinsfile 而且我无法影响存储库本身 这意味着我既不能向存储库添加也不能更改任何文件 在本例中 它是Qt repo http cod
  • ArrayAdapter 中 textview 的自定义字体

    我正在尝试更改 a 的字体TextView in my ArrayAdapter 字体chantelli antiqua ttf位于资产文件夹中 这是我的 Java 代码 listItemAdapter new ArrayAdapter
  • 按字母顺序对数组进行排序

    我有一个数组 我需要按出现次数对其元素进行排序 然后按字母顺序排序 例如 55 The 32 ASomething 32 BSomething ASomething should come before Bsomething because
  • 在iOS中以编程方式生成ppt

    为了生成 PDF 文件 我们可以使用 Core Graphics 同样 是否有任何框架 类可用于通过代码生成 ppt 幻灯片演示 文件 或者是否有任何第三方框架用于此目的 没有内置的 Apple API 我也从未听说过有这样的第三方框架
  • 将 sybase 中现有的 int 列更改为标识

    赛贝斯12 5 我有一个正在生产中的现有表 需要更改它的 PK int 列 以便自动填充 创建表时 理想情况下将 ID 列创建为标识 此 ID 列是多个其他表中的外键 因此不能删除该表并重新开始 问题是 我无法将 PK 设置为 IDENTI
  • 如何使面板内的鼠标拖动从窗口移开?

    我想启用这个 System Windows Forms Panel 以便如果用户单击并拖动鼠标 则将窗口拖动到周围 我可以这样做吗 我必须实施多个事件吗 最适合我的解决方案是使用非托管代码 与 HatSoft 发布的答案不同 它可以为您提供
  • MySQL:如何实现行级事务锁定而不是表锁定

    这是用例 我有一张桌子 上面有一堆可用或不可用的唯一代码 作为事务的一部分 我想选择表中可用的代码 然后在事务中更新该行 由于这种情况可能会同时在许多会话中同时发生 因此我希望理想地选择一个随机记录并在表上使用行级锁定 以便其他事务不会被从