基于MySQL的消息队列
此表用作具有多个读写器的消息队列:基于MySQL的消息队列,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 WH
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;
将事务隔离级别设置为可序列化;
从MyQueue选择message FROM MyQueue,其中at有助于将查询包装到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;
启动事务;
从{Table}中选择id、at、message,其中在1)您的DDL不能保证所选记录和更新的记录是相同的-at
字段不是唯一的。2) 将此操作作为一个查询执行,而不是两个单独的查询。