mysql - 基于 MySQL 的消息队列
问题描述
该表用作具有多个读取器和写入器的消息队列:
CREATE TABLE IF NOT EXISTS MyQueue(
id CHAR(36) PRIMARY KEY NOT NULL,
at DateTime NOT NULL,
message TEXT NOT NULL,
INDEX(at ASC));
我尝试通过使用更新锁来防止重复阅读消息:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT message FROM MyQueue WHERE at <= @today ORDER BY at ASC LIMIT 1 FOR UPDATE;
UPDATE MyQueue SET at=@nextDay WHERE at <= @today ORDER BY at ASC LIMIT 1;
(想法是在今天晚些时候在一位读者成功处理后删除消息,或者明天重新处理。)
但看起来一些双重读取仍然是可能的。要注意什么?
解决方案
它有助于将查询包装到 Tx 中:
START TRANSACTION;
SELECT id, at, message FROM {Table} WHERE at <= @now ORDER BY at ASC LIMIT 1 FOR UPDATE;
UPDATE {Table} SET at=@timeout WHERE at <= @now ORDER BY at ASC LIMIT 1;
COMMIT;
推荐阅读
- javascript - 如何通过 Chrome 应用模式窗口在资源管理器中打开本地文件夹?
- url-rewriting - 使根成为特定的数据集表页面
- python - 使pytest单元测试程序适用于多个文件
- swift - 如何在保持高效的同时在 NSPredicates 中使用 AND 和 ANY
- python - UsageError: 未找到单元魔法`%%R`-Jupyter Notebook-Windows 10
- mysql - MySQL工作台问题中的外键和导入数据
- java - Android libaums - 已被允许记住的 USB 驱动器自动启动应用程序失败
- css - 类型“字符串”不可分配给类型“WebkitAppearance | 在 React + TypeScript 中未定义?
- css - 如何使标题始终保持水平而不是溢出
- go - 谷歌人员 API 无法获取电子邮件地址