From: | Kris Kiger <kris(at)musicrebellion(dot)com> |
---|---|
To: | |
Cc: | "Pgsql-Admin (E-mail)" <pgsql-admin(at)postgresql(dot)org> |
Subject: | Functions and transactions |
Date: | 2005-03-09 20:52:19 |
Message-ID: | 422F6203.1090800@musicrebellion.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin pgsql-hackers pgsql-patches |
Here is my problem. I have a function that is triggered on insert. For
simplicity's sake, lets say the function looks like this:
CREATE OR REPLACE FUNCTION dostuff_on_insert() RETURNS TRIGGER AS '
DECLARE lockrows RECORD;
BEGIN
select into lockrows * from table1 where pkey_id = NEW.pkey_id for
update on table1;
update table1 set active = false where NEW.pkey_id = pkey_id and active;
NEW.active := true;
END;
'language 'plpgsql';
I have two inserts, lets say insert A and insert B. A new explicit
transaction block is started with the intent of executing insert A.
begin;
insert into table1 (stuff) VALUES (morestuff);
At this time another terminal is opened up and insert B is executed in
the same fasion:
begin;
insert into table1 (stuff) VALUES (different_more_stuff);
In my two open terminals insert A has completed and insert B is waiting
for insert A's transaction to be committed, before it can move on. I
commit insert A and check to see how many active row's I have for that
ID (there should be 1, the new row).
commit;
select * from table1;
I find that there is one active row. Everything is fine at this point.
Now, I commit insert B, that has just finished, because insert A has
been committed. I expect to see 1 active row, because the update
contained in the function has not been executed, and has therefore not
grabbed a snapshot of the table yet. I expect that the new row from
insert A will be updated as well.
commit;
select * from table1;
To my surprise, I see 2 active rows. What i'm assuming is happening
with the transaction must be flawed. Does the function handle a
transaction outside of the one the insert is using? Just trying to
figure out what exactly is going on and why.
Thanks in advance for the insight. If it would be easier to understand
by having me paste what is happening directly from the terminals, let me
know.
Kris
From | Date | Subject | |
---|---|---|---|
Next Message | Adrian Engelbrecht | 2005-03-09 21:05:03 | Re: Slow Update |
Previous Message | Magnus Hagander | 2005-03-09 17:31:23 | Re: Tablespace On 8.0 (Windows) |
From | Date | Subject | |
---|---|---|---|
Next Message | Tsirkin Evgeny | 2005-03-09 21:07:51 | Re: Functions and transactions |
Previous Message | Thomas Hallgren | 2005-03-09 18:27:37 | Runtime accepting build discrepancies |
From | Date | Subject | |
---|---|---|---|
Next Message | Tsirkin Evgeny | 2005-03-09 21:07:51 | Re: Functions and transactions |
Previous Message | pgsql | 2005-03-09 15:38:27 | Re: [pgsql-hackers-win32] snprintf causes regression |