Re: Functions and transactions

From: Tsirkin Evgeny <tsurkin(at)mail(dot)jct(dot)ac(dot)il>
To: Kris Kiger <kris(at)musicrebellion(dot)com>
Cc: "Pgsql-Admin (E-mail)" <pgsql-admin(at)postgresql(dot)org>
Subject: Re: Functions and transactions
Date: 2005-03-09 21:07:51
Message-ID: 422F65A7.1070303@mail.jct.ac.il
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin pgsql-hackers pgsql-patches


What transaction level are you using?
Evgeny.
Kris Kiger wrote:
> 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
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Kris Kiger 2005-03-09 21:10:28 Re: Functions and transactions
Previous Message Adrian Engelbrecht 2005-03-09 21:05:03 Re: Slow Update

Browse pgsql-hackers by date

  From Date Subject
Next Message Kris Kiger 2005-03-09 21:10:28 Re: Functions and transactions
Previous Message Kris Kiger 2005-03-09 20:52:19 Functions and transactions

Browse pgsql-patches by date

  From Date Subject
Next Message Kris Kiger 2005-03-09 21:10:28 Re: Functions and transactions
Previous Message Kris Kiger 2005-03-09 20:52:19 Functions and transactions