Я пишу скалярную функцию plpgsql, которая содержит функцию C, которая имеет побочный эффект вне базы данных. Когда функция вызывается, в некоторых произвольных SQL (триггер, выбор, запись и т. Д.), Я хочу, чтобы побочный эффект был зафиксирован или откат на границе работы PostgreSQL (UOW). Я могу обрабатывать фиксацию UOW, но я не знаю, как «поймать» ROLLBACK базы данных и откатить побочный эффект. Ключевым моментом является то, что я пишу функцию, но не контролирую, как она называется, т. Е. Я не могу «заставить» вызов быть в блоке с обработчиками EXCEPTION. Есть идеи?Как поймать PostgreSQL ROLLBACK для функции с побочными эффектами UOW?
Для фиксации я планирую включить функцию INSERT plpsql в базу данных TABLE, которая имеет триггер «... ПОСЛЕ ВСТАВКИ ... ВЫПОЛНИТЬ ПРОЦЕДУЮ commit_my_side_effect()», поэтому, когда UOW зафиксировано, строка совершенное, срабатывание триггера AFTER INSERT и престо, побочный эффект совершен;
Единственная идея, которую я имею до сих пор, - это передать txid_current() фоновому рабочему процессу. Затем, при некотором сердцебиении, использующем SPI, проверьте, не находится ли txid в полете или совершено, тогда его, должно быть, отбросили назад. Но это похоже на тяжелый подъем.
Спасибо, Nick, NOTIFY на КАНАЛЕ - отличное предложение, но оно не позволяет боковому эффекту стрелять в нужное время. –