Эта таблица используется в качестве очереди сообщений для нескольких читателей и писателей:
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;
( Идея состоит в том, чтобы удалить последнее сообщение сегодня после успешной обработки одним из читателей или повторной обработки завтра.)
Но похоже, что некоторые двойные чтения все еще возможны. На что обратить внимание?