Re: Question on triggers and plpgsql
От | Tom Lane |
---|---|
Тема | Re: Question on triggers and plpgsql |
Дата | |
Msg-id | 14740.1112974547@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: Question on triggers and plpgsql (Andrew Sullivan <ajs@crankycanuck.ca>) |
Ответы |
Re: Question on triggers and plpgsql
Re: Question on triggers and plpgsql |
Список | pgsql-sql |
Andrew Sullivan <ajs@crankycanuck.ca> writes: > On Fri, Apr 08, 2005 at 10:36:26AM -0400, Tom Lane wrote: >> AFAICS the only way that you could get into a can't-roll-back situation >> is if the trigger tries to propagate the update outside the database. >> For instance, the proverbial trigger to send mail: once sent you can't >> cancel it. But really this is dangerous even in an AFTER trigger --- >> the transaction could still be rolled back after the AFTER trigger >> fires. > People who know more about this will no doubt correct me, but isn't > such a case crying out for LISTEN/NOTIFY instead? That is, your > trigger puts the mail content into a table of mails to be sent, and > wakes up the mail-sender client with the NOTIFY; the NOTIFY and the > commit to the mail-it table only happen in that case if the > transaction commits. And since mail is async anyway, the extra few > seconds shouldn't make any difference, right? We do often recommend that, though it occurs to me that this just moves the failure case somewhere else. The hypothetical mail-sending process would presumably want to send mail and then delete the associated record from the table of pending mails ... so what if it fails after sending the mail and before committing the delete? What this does do for you is replace the risk of phantom emails (mail sent but corresponding action inside the database never committed) with the risk of duplicate emails (mail-sender sends you another one after it restarts). In most cases I think I'd prefer the latter. regards, tom lane
В списке pgsql-sql по дате отправления: