Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于MySQL的消息队列_Mysql - Fatal编程技术网

基于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) 将此操作作为一个查询执行,而不是两个单独的查询。