172 похожих чатов

1) xmin, xmax можно не брать у строки, есть txid_current().

Ко-во if-ов уменьшается имея просто один параметр и логика становится сильно проще.

2)
Есть функция txid_visible_in_snapshot, что ещё больше упрощает понимаение.

3)
> ортить по паре (id, operation_type).
Это утверждение вообще говоря неправильное и приведёт к ошибкам. Видимо нужно сделать _id в таблице log и по ней сортить.

4)
Триггеры нормально работают с областью видимости в транзакции, а так же их действия откатываются.
Выходит, что всю это логику с видимостью можно впринципе убрать, так как, когда запускается синхронизатор, то он видит уже видимые закомиченные строки и может их потреблять в упорядоченном по _id.
Это правда?

Учитывая пункт 4, получается, что решение свелось к тому, что предложил Андрей выше с bigserial. Отличие в том, что у нас всё помещается в отдельный log и теперь пропущенные строки будут потребляться.


Мне кажется, что здесь должна быть где-то ошибка.

Приведу примерный sql фрагмент.
create table metrics (id bigserial primary key, device_id int, value int);
create table metrics_log (like metrics);
alter table metrics_log add column op_type text, add column _id bigserial primary key;

create or replace function tg_func_metrics_log () returns trigger as $xxx$
declare
rec record;
txid bigint;
begin
select txid_current() into txid;
IF TG_OP = 'INSERT' THEN
EXECUTE format('insert into %I select ($1).*, $$insert$$', TG_TABLE_NAME || '_log') using NEW;
RAISE NOTICE 'insert % % % %', NEW.id::text, NEW.xmin, NEW.xmax, txid;
rec = NEW;
END IF;
IF TG_OP = 'UPDATE' THEN
EXECUTE format('insert into %I select ($1).*, $$delete$$', TG_TABLE_NAME || '_log') using OLD;
EXECUTE format('insert into %I select ($1).*, $$insert$$', TG_TABLE_NAME || '_log') using NEW;
RAISE NOTICE 'delete % % % %', OLD.id::text, OLD.xmin, OLD.xmax, txid;
RAISE NOTICE 'insert % % % %', NEW.id::text, NEW.xmin, NEW.xmax, txid;
rec = NEW;
END IF;
IF TG_OP = 'DELETE' THEN
EXECUTE format('insert into %I select ($1).*, $$delete$$', TG_TABLE_NAME || '_log') using OLD;
RAISE NOTICE 'delete % % % %', OLD.id::text, OLD.xmin, OLD.xmax, txid;
rec = OLD;
END IF;
return rec;
end;
$xxx$ language plpgsql;

create trigger trigger_metrics_log
after insert or update or delete on metrics
for each row execute procedure tg_func_metrics_log();


insert into metrics (device_id, value) values (1, 1);
update metrics set value = 2 where id = 1;
delete from metrics;

Здесь нету sql кода синхронизатора. Поидее он должен брать какие-то строки из log и удалять их после потребления. Работать должен минимум в repeatable read.
Само потребление можно сделать, как выгрузку в csv файл или в таблицу для простоты.

1 ответов

19 просмотров

> Здесь нету sql кода синхронизатора. Поидее он должен брать какие-то строки из log и удалять их после потребления. Если так, зачем тут вообще XID-ы? Почему бы просто не логировать все операции, как у Вас, а потом не удалять при потреблении? Т.е. WITH d AS (DELETE FROM metrics_log RETURNING *) INSERT INTO target(...) SELECT ... FROM d;

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта