MySQL очередь сообщений - PullRequest
1 голос
/ 25 марта 2020

Эта таблица используется в качестве очереди сообщений для нескольких читателей и писателей:

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;

( Идея состоит в том, чтобы удалить последнее сообщение сегодня после успешной обработки одним из читателей или повторной обработки завтра.)

Но похоже, что некоторые двойные чтения все еще возможны. На что обратить внимание?

1 Ответ

1 голос
/ 25 марта 2020

Это помогло обернуть запрос в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...