В нашей базе данных (PostgreSQL) есть следующие две многократно и независимо выполняемые задачи:
Сессия 1 выполняет некоторые обновления в транзакции и устанавливает метку времени обновленных наборов данных:
BEGIN;
...
UPDATE table SET ..., timestamp = current_timestamp WHERE ...;
... // (A)
COMMIT;
Сессия 2 выбирает все наборы данных, которые были обновлены с момента его последнего запуска:
SELECT * FROM table WHERE timestamp BETWEEN last_run AND current_timestamp;
last_run = current_timestamp;
...
Если сеанс 2 начинается, когда сеанс 1 находится в точке (A), он не увидит изменений, поскольку отметка времени не будет установлена до фиксации, но будет иметь более раннее значение.
Более того, ни один последующий сеанс 2 не выберет изменения, потому что last_run уже будет больше, чем отметка времени.
Таким образом, проблема в том, что сеанс 1 устанавливает временную метку в неправильное значение, соответственно в неправильное время, и, таким образом, изменения могут быть «забыты».
Возможный обходной путь - сохранить обновленные идентификаторы наборов данных в другой таблице в сеансе 1, а также выбрать и удалить их из этой таблицы в сеансе 2.
Но, возможно, у кого-то есть идея получше ...