Мы имеем следующие два неоднократно и независимо друг от друга выполнение задач в нашей базе данных (PostgreSQL):Установка временной метки внутри транзакции
Сессия 1 делает некоторые обновления в транзакции и установить метку обновленных наборов данных:
BEGIN;
...
UPDATE table SET ..., timestamp = current_timestamp WHERE ...;
... // (A)
COMMIT;
Session 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. Но, возможно, кто-то есть идея получше ...
Вам нужен механизм, позволяющий одновременно запускать? Если это так, требуется точный код и бизнес-логика.Чаще всего вы рассматриваете каждый блок транзакций как фиксированный блок, когда один процесс находится внутри блока, ни один другой процесс не может запустить блок. Это прямо избегает «но что, если кто-то начал, но не закончил» проблему. Это достигается за счет использования блокировок таблиц/строк. Знаете ли вы, что вы предпочитаете? – MatBailie
Должно быть возможно запустить их одновременно. Код довольно большой, поэтому я не могу опубликовать его, но задача 1 в основном импортирует данные, а задача 2 экспортирует изменения. Экспортер должен запускаться каждые 30 минут и не может дождаться возможного импорта. Импортер работает чаще, но на короткое время и не может дождаться, когда экспортер будет работать около 20 минут. – jpstrube