【发布时间】:2014-03-10 07:44:03
【问题描述】:
编辑
我使用node.js felixge-mysql 并且有一个 池 mysql 连接。
原创
我有一个 mysql 数据库,其中有 2 个表:
- “对话”,存储元数据:用户 ID (2)、主题、时间戳等。
- “messages”,存储具有 FK 和 conversation.id 的消息
现在我总是这样做:
-
SELECT“对话” - 检查元数据是否允许请求的操作
- 在“对话”上执行
UPDATE(更改一些元数据,例如 lastUpdatedTimestamp) - 可能是
INSERT将消息写入“消息”。
在消息旁边,用户还可以block 对话(来自他的身边!)
对话UPDATE 和可能的消息INSERT 将在事务中发生。
一个警告:在我SELECT 对话行并在应用程序级别检查元数据之后,可能不允许请求的操作,导致UPDATE 和可能的INSERT 永远不会被执行!
第一季度
现在如何从我选择对话行的那一刻起读取锁定对话行?但是当元数据导致“用户错误”时仍然能够释放锁定(例如,当前 userId 不是“this”对话中的 userId)。
第二季度
现在我正在使用一个 redis 'locks' db,它通过使用 Lua 锁定给定的 id 并使用 node.js 事件来释放这个锁。这些 redis 锁有超时。 (例如 1000 毫秒)。有没有办法在 mysql 锁上设置超时?
【问题讨论】:
-
SELECT FOR UPDATE不会阻止读取访问(简单的 SELECT),但会阻止其他SELECT FOR UPDATE读取锁定的行。如果一行被另一个会话锁定,SELECT FOR UPDATE将保持等待直到锁定被释放。