Вы правы, что вы должны опросить свою базу данных на предмет изменений, и что MySQL не может передавать изменения в другие приложения.
Хитрость заключается в том, чтобы использовать серверное время для опроса.Используйте таблицу, чтобы следить за опросом.Например, предположим, что ваши пользователи имеют значения user_id.Затем создайте таблицу poll
, состоящую из
user_id INT primary key
polldate DATETIME
Затем при опросе выполните эту последовательность.
Сначала убедитесь, что у вашего пользователя есть запись в таблице poll
, показывающая длинный-аго polldate
.(INSERT IGNORE не перезаписывает ни одну существующую строку в таблице.)
SET @userid := <<your user's id>>;
INSERT IGNORE INTO poll (user_id, polldate) VALUES (@userid, '1970-01-01')
Затем при опросе выполните эту последовательность операций.
Блокировка строки опроса для пользователя:
BEGIN TRANSACTION;
SELECT polldate INTO @polldate
FROM poll
WHERE user_id = @userid
FOR UPDATE;
Извлечение нужных обновленных строк;с момента последнего обновления.
SELECT t.whatever, t.whatelse
FROM transaction_table t
JOIN poll p ON t.user_id = p.user_id
WHERE user_id = @userid
AND t.last_update_date > p.polldate;
Обновление столбца опроса таблицы poll
UPDATE poll p
SET p.polldate = IFNULL(MAX(t.last_update_date), p.polldate)
FROM transaction_table t
JOIN poll_p ON t.user_id = p.user_id
WHERE user_id = @userid
AND t.last_update_date > p.polldate;
И фиксация транзакции.
COMMIT;
Каждый раз, когда вы используетеВ этой последовательности вы получите элементы из вашей таблицы transaction
, которые были обновлены после предыдущего опроса.Если нет элементов, polldate
не изменится.И все это во времени сервера.
Вам нужна транзакция на случай, если какой-то другой клиент обновит строку таблицы транзакций между вашим SELECT и вашими запросами UPDATE.