Added to TODO: * Allow UPDATEs on only non-referential integrity columns not to conflict with referential integrity locks http://archives.postgresql.org/pgsql-hackers/2007-02/msg00073.php
--------------------------------------------------------------------------- Jan Wieck wrote: > On 2/8/2007 2:46 PM, Marc Munro wrote: > > On Thu, 2007-08-02 at 14:33 -0500, Tom Lane wrote: > >> Marc Munro <[EMAIL PROTECTED]> writes: > >> > Yes in this case, T1 must abort because the record it was going to > >> > update has disappeared from underneath it. I don't see how this is > >> > significantly different from the same race for the record if the table > >> > had no RI constraints. The only difference that I can see, is that T1 > >> > now has some locks that it must relinquish as the transaction aborts. > >> > >> No, the difference is there would have been no error at all before; > >> if the record were deleted before T1 got to it then it wouldn't have > >> attempted to update it. I really don't think you can make it work > >> to perform updates or deletes on a record you have not yet locked. > > > > The record would be locked before the update or delete is attempted, > > however it would not be locked until the referential integrity > > constraints have succeeded in acquiring their locks. > > > > It is becoming clear to me that I am missing something but I still don't > > know what it is. If anyone can see it and explain it I'd really > > appreciate it. > > I think you are missing the fact that the exclusive row lock on UPDATE > is taken before any triggers are fired at all, even BEFORE ROW triggers. > This is necessary in order to prevent the row being updated or removed > concurrently while the triggers are executing. Since BEFORE ROW triggers > can modify the content of the row (including the foreign key), the RI > check and lock of the referenced row cannot happen before other BR > triggers are completed. > > In order to make your idea fly, the RI check trigger on INSERT or UPDATE > would have to be fired before taking the row lock considering the NEW > values for referencing columns as they are thus far. Since the row isn't > locked at this time, it can change or disappear while the RI trigger is > executing, so the check and lock has to be redone later with the actual > row that got locked and after all BR triggers are done with it. > > > Jan > > -- > #======================================================================# > # It's easier to get forgiveness for being wrong than for being right. # > # Let's break this rule - forgive me. # > #================================================== [EMAIL PROTECTED] # > > ---------------------------(end of broadcast)--------------------------- > TIP 1: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to [EMAIL PROTECTED] so that your > message can get through to the mailing list cleanly -- Bruce Momjian <[EMAIL PROTECTED]> http://momjian.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings