Re: background triggers? - Mailing list pgsql-general

From Florian G. Pflug
Subject Re: background triggers?
Date
Msg-id 44760728.9010900@phlo.org
Whole thread Raw
In response to Re: background triggers?  ("Dawid Kuroczko" <qnex42@gmail.com>)
List pgsql-general
Dawid Kuroczko wrote:
> On 5/25/06, Rafal Pietrak <rafal@zorro.isa-geek.com> wrote:
>> > Well, exactly "not being interested in the outcome" is IMHO the reason
>> > why your demands clash with archtecture of a RDBMS. Most RDBMS go a
>> long
>> > way to ensure consistency and safety of your data, once they promised
>> > (usually by not raising an error at least on "commit") that they stored
>> > them. This doesn't match very well with asynchronous processes for
>> which
>> > "nobody cares" (In the sense that there is nobody to reports errors
>> to)..
>>
>> No, no no. This is completly different story.
>>
>> That would really be very missfortunate if we couldn't relay on RDBMS
>> 'confirmed storage'.
>
> Oh, I think Florian meant that it is strange that your application is not
> interested in the trigger's output.  Of course one might want to add
> a notify-about-a-trigger-failure-by-email feature to circumvent that,
> but I won't be going so far off.
Ouch. ;-)

> What is here, is that with your approach, you fire a trigger and forget
> about it.  It either commits some time later, or does not, and you
> don't know it.  You don't know it, because your application went on,
> did other things, and has no way of knowing what's with the commit.
>
> Well, you can speculate, that you will notice that no work is being
> done.  But why?  Maybe the trigger is inefficient and isss soo sloooow,
> iittt taaaakessss aaaaaggeeees tooo cooompleeete.  Or maybe
> it ROLLBACKed, effectively removing all evidence of the work done.
> With this approach, you don't know it -- and this is what probably
> struck Florian's "strange for RDBMS" feeling.
This is exactly what I meant. Since there is always a possibillity for
failure (out of space, maschine crash, ...), all guarantees a RDBMS
gives you are of the form "If I responded with OK to command ... _then_
you can assume .....".

Doing things asynchronously defeats this for two reasons. First, nobody
will be able to check "if it responded OK". Second, since your proposed
background trigger would _need_ to fire only after the transaction
comitted (Which snapshot should it see otherwise? And when would its own
changes be visible?). But what if the trigger fails then? I can't cause
the transaction that caused it's run to rollback now, because the
database already committed that transaction.

>> I mean. It looks like this is *really* a novelty for RDBMS design - I
>> feel, that real programmers here (you guys :) are so hard to persuade
>> its necesary, because it's so far from the 'synchronous nature' of
>> clasical RDBMS design and triggers in particular.
>
> Don't get me wrong, but a word "bizzarre" is more suitable than
> "novelty".  The background processing is there since very long
> time -- why do you think LISTEN/NOTIFY was implemented? :)
>
>> But I'd like to express my believe, that having such tool within the
>> server can help build better database applications.
IMHO it won't. The _very_ reason why people use database systems is
because they provide strong guarantees about isolation and durability
of transactions. _Additionally_ the provide convenient searching, and
indexing, and stuff like that. But, at least from my point of view, the
part really hard to get right is the correct behavior of transactions.

I know that people "grew up" with mysql, especially mysql before at
least version 4, think differently. For them, a database is merely a
convenient replacement for flat files, providing a nice language (sql)
to specify complicated algorithms which would be tendious to hand-code.
If this is your interpretation of what a database does, then I can see
why this "background trigger" feature sounds so intriguing.

But if look
at things from the "transactional" point of view, then the feature
doesn't sound intriguing any more, because it just doesn't work together
well with transactions, and would have very strange semantics when
compared to other feature of the database.

>> I would only call it a framework if I can say COMMIT within the trigger
>> body. Or alternatively, if I can define a trigger, so to say: "FOR EACH
>> COMMIT" (pls note, that it's a different point in time, then "FOR EACH
>> STATEMENT") which I could also define as "DETACHED" - launched by the
>> forked backend.
I'd suggest that you try to find a way to do what you want _outside_ of
the backend. I'd actually love to see a more generic pgAgent (see my
other mail) that is distributed in contrib, or even installed by default.

You could use such a "postgres-aware" cron to schedule vacuum runs,
periodic cleanup jobs, or start some procedure on some notification.
_But_ it wouldn't be part of the backend. It would be a separate
process, connecting like any other process.

> Actually, I like the idea of "ON COMMIT" trigger (though without the
> "DETACHED" part), but this is another story...
Me too, although 2PC-Transactions would actually need to call it on
prepare, not on commit, so "on commit" would be a bad name.

greetings, Florian Pflug

pgsql-general by date:

Previous
From: "P.M"
Date:
Subject: move from 1 database to another
Next
From: Rafal Pietrak
Date:
Subject: Re: background triggers?