Mysql 读锁 SELECT FOR UPDATE

2024-03-12

EDIT

I use Node.js felixge-mysql https://github.com/felixge/node-mysql#pooling-connections并有一个poolmysql 连接数。

ORIGINAL

我有一个 mysql 数据库,其中有 2 个表:

  1. “对话”,存储元数据:用户 ID (2)、主题、时间戳等。
  2. “messages”,存储具有对话 ID 的 FK 的消息

现在我总是这样做:

  1. SELECT一个对话”
  2. 检查元数据是否允许请求的操作
  3. 执行一个UPDATE关于“对话”(更改一些元数据,例如lastUpdatedTimestamp)
  4. 可能INSERT一条消息变成“消息”。

除了消息之外,用户还可以block谈话(从他这边!)

对话UPDATE以及可能的消息INSERT将发生在交易内。

一个警告:在我之后SELECT对话行并检查应用程序级别的元数据,可能是不允许请求的操作,从而导致UPDATE和可能的INSERT永远不会被处决!

Q1

现在如何从选择对话行的那一刻起读取锁定对话行?但当元数据导致“用户错误”时,仍然能够释放锁定(例如当前 userId 不是“this”对话中的 userId)。

Q2

现在我正在使用 redis 'locks' db,它通过使用 Lua 锁定给定的 id,并使用 node.js 事件来释放此锁。这些redis锁有超时时间。 (例如 1000 毫秒)。有没有办法给mysql锁设置超时?


您正在寻找命名锁(小心,危险的东西,不要在生产服务器上尝试锁:D)。

看一眼:

  • GET_LOCK(str, timeout) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock
  • RELEASE_LOCK(str) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_release-lock
  • IS_FREE_LOCK(str) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-free-lock
  • IS_USED_LOCK(str) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-free-lock

A1:选择一个唯一的字符串来锁定和使用GET_LOCK在其上(比如说,GET_LOCK('conversation_' || [id]);如果它返回1锁是你的。做你想做的事,稍后再打电话RELEASE_LOCK(考虑所有可能的情况,包括错误)。

A2:第二个参数GET_LOCK超时时间为seconds。如果操作超时GET_LOCK将返回0.

来自官方文档

GET_LOCK(str,timeout)

Tries to obtain a lock with a name given by the string str, using a timeout of timeout seconds. Returns 1 if the lock was obtained successfully, 0 if the attempt timed out (for example, because another client has previously locked the name), or NULL if an error occurred (such as running out of memory or the thread was killed with mysqladmin kill). If you have a lock obtained with GET_LOCK(), it is released when you execute RELEASE_LOCK(), execute a new GET_LOCK()1, or your connection terminates (either normally or abnormally)2. Locks obtained with GET_LOCK() do not interact with transactions. That is, committing a transaction does not release any such locks obtained during the transaction.

This function can be used to implement application locks or to simulate record locks. Names are locked on a server-wide basis3. If a name has been locked by one client, GET_LOCK() blocks any request by another client for a lock with the same name. This enables clients that agree on a given lock name to use the name to perform cooperative advisory locking. But be aware that it also enables a client that is not among the set of cooperating clients to lock a name, either inadvertently or deliberately, and thus prevent any of the cooperating clients from locking that name. One way to reduce the likelihood of this is to use lock names that are database-specific or application-specific. For example, use lock names of the form db_name.str or app_name.str.

粗体是我的:

  1. 意味着每个连接只能持有一个锁(对于您的用户案例来说不是问题)
  2. 意味着一旦你解锁,锁就会被释放close连接
  3. 意味着两个不同的连接(即使来自同一个池)可能无法立即获取相同的外观。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql 读锁 SELECT FOR UPDATE 的相关文章

随机推荐

  • JS中的罗马到整数为什么只转换第一个字符

    我尝试解决Leedcode问题13 问题是给定一个罗马数字 将其转换为整数 输入保证在1到3999的范围内 这是我的代码 我想知道为什么它只将罗马数字中的第一个字符转换为整数 var romanToInt function s var re
  • 使用 mod_rewrite 将所有流量重定向到 index.php

    我正在尝试构建一个 url 缩短器 并且我希望能够在域之后立即获取任何字符并将它们作为变量 url 传递 例如 http google com asdf http google com asdf 会成为 http www google co
  • 从数据库中选择最受欢迎的地点的算法

    我们有一个包含地点数据库的网站 对于每个地方 我们的用户都可以执行我们记录的以下操作之一 查看 查看其个人资料 评级 按 1 5 星的等级对其进行评级 审查 审查它 已完成 标记他们已经去过那里 愿望清单 标记他们想去那里 最喜欢的 标记这
  • 实体框架,更新前值的触发机制

    EF 中是否有在更新对象值之前具有的内容 例如当实体对象 假设用户 被保存时 我想在更新用户对象值之前了解日志记录的目的 Thanks 如果您与ObjectContext edmx 您可以订阅SavingChanges http msdn
  • 为什么我无法实例化 switch-case 块内的对象

    我的代码有 3 个类 n hexa n octa n bin 代码在这里 switch choice case 1 cin gt gt n n hexa nx n break case 2 cin gt gt n n octa no n b
  • 如何使用 gulp 在浏览器中进行刷新

    我有一个应用程序在 iis 中 它是一个用 angularjs 和 webapi C 2 0 制作的应用程序 我想创建一个任务 在保存任何 js 文件后立即更新浏览器 吞咽版本 3 9 1 gulp task livereload func
  • 尝试在本地环境中调试 LeetCode 答案时出错

    我正在研究 LeetCode 问题199 二叉树右侧视图 https leetcode com problems binary tree right side view 给定二叉树的根 想象自己站在它的右侧 返回您可以看到从上到下排序的节点
  • 无法使用通过 VS2010 发布在 Windows Azure 上发布网站

    当我尝试通过 Visual Studio 2010 在 Windows Azure 上发布我的 Web 应用程序时 我遇到了这个问题 我尝试右键单击项目并选择发布并导入从 Windows Azure 平台下载的发布配置文件 我收到此错误 错
  • 加入多个文件

    我正在使用标准连接命令来连接两个基于column1 的排序文件 命令很简单 join file1 file2 gt output file 但是如何使用相同的技术连接 3 个或更多文件呢 连接 file1 file2 file3 gt 输出
  • 在运行时根据输入从属性文件中获取值 - java Spring

    我的 color properties 文件为 rose red lily white jasmine pink 我需要获取颜色值 String flower runTimeFlower Value flower String colour
  • Playframework 2.0.x 是否支持模板中的

    不知道play 2 0 3及更高版本是否支持else if在视图中 我只读到必须这样编码 if else if else 不敢相信 我在第二个 if 之前使用了 if true else if true else
  • 使用 nltk 没有上下文的词性标记

    有没有一种简单的方法来确定给定单词最可能的词性标签没有上下文使用nltk 或者如果不使用任何其他工具 数据集 我尝试使用 wordnet 但似乎 sysnet 不是按可能性排序的 gt gt gt wn synsets says Synse
  • Android计算器-Editview无法输入小数位

    我是Android代码开发新手 我正在开发一个Android计算器应用程序 不明白为什么两个EditText 第一个输入和第二个输入 不能接受小数位而只能输入整数 附如下是代码 Thanks 主要活动 package com trial j
  • 将 ScriptableObjects 加载到单个预制件/多个预制件的最佳实践是什么?

    脚本化对象 SO 我最近一直在尝试了解 ScriptableObjects 并在 Unity 中建立了一个项目 我只想射击生成的传入敌人 我已经设置了它 这样我就可以通过 SO s 创建不同的敌人 但注意到我仍然需要为每个敌人创建一个预制件
  • 我们可以简化这个字符串编码代码吗

    是否可以将此代码简化为更干净 更快的形式 StringBuilder builder new StringBuilder var encoding Encoding GetEncoding 936 convert the text into
  • 当有人加入时创建规则协议

    我想要一个机器人将新成员设置为只能查看一个频道并且必须就规则达成一致才能使用服务器的角色 我已经写了这个来做到这一点 但我不断收到此错误 Ignoring exception in on member join Traceback most
  • 仅来自 Sharepoint 列表的自定义字段

    是否可以循环访问共享点列表的字段集合并仅检索我们的自定义字段而不是共享点内置字段 using SPSite site new SPSite http localhost using SPWeb web site OpenWeb SPList
  • 如何实现带进度条的闪屏? - 安卓

    我在启动时有一个闪屏 与以下编码 public class Splash extends Activity Override protected void onCreate Bundle savedInstanceState TODO Au
  • 检查用户是否在 C 中输入字母或数字

    有没有一种简单的方法来调用 C 脚本来查看用户是否输入了英文字母表中的字母 我在想这样的事情 if variable a z printf You entered a letter You must enter a number else
  • Mysql 读锁 SELECT FOR UPDATE

    EDIT I use Node js felixge mysql https github com felixge node mysql pooling connections并有一个poolmysql 连接数 ORIGINAL 我有一个