У меня есть несколько баз данных, которые синхронизируются с использованием таблицы журнала:
source bigint,
tick serial,
data text
primary key (source, tick)
Таким образом, наивный подход к синхронизации, например, заключается в том, что мой второй источник синхронизирует данные из первого источника:
insert into log_table (source, tick, data)
select source, tick, data
from other_db.log_table
where source = 1
and tick > (select max(tick) from log_table where source = 1)
Я упростил пример.На практике это использует dblink для запроса другой базы данных, но я не думаю, что это имеет отношение к этой проблеме.Проблема, с которой я столкнулся, заключается в том, что, если у меня несколько потоков, синхронизирующихся, я получаю нарушения ключа.
Мой текущий способ - обнаружить нарушение ключа и просто повторить попытку.Вполне вероятно, что эта повторная попытка ничего не обработает, так как другой поток выполнит эту работу.Мне интересно, может быть, есть более эффективный подход?