pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: SZŰCS Gábor <surrano@mailbox.hu>
To: pgsql-bugs@postgresql.org
Subject: Re: Killed backend won't rollback transaction?
Date: Mon, 8 Nov 2004 15:21:03 +0100
Message-ID: <003d01c4c59e$2e2d1e70$0403a8c0@fejleszt4> (raw)
References: <012601c4c292$6804b810$0403a8c0@fejleszt4>
	<26896.1099590388@sss.pgh.pa.us>
	<011201c4c33b$7bd722c0$0403a8c0@fejleszt4>
	<013b01c4c347$195212c0$0403a8c0@fejleszt4>
	<26614.1099670548@sss.pgh.pa.us>

Dear Tom,

----- Original Message ----- 
From: "Tom Lane" <tgl@sss.pgh.pa.us>
Sent: Friday, November 05, 2004 5:02 PM


> SIGTERM on individual backends is not recommended or supported.

That explains this. Keeping this policy in mind, I wouldn't qualify this as
a bug after all.

> FWIW, though, I could not duplicate this bug report.  Are you sure you
> know what the second one was really waiting on?

Yeah I'm quite sure. See sample below. Ask for a working example if you
wish.

The main concept is that a system() call from a C function causes another
connection to be opened, and the original connection, after locking the
tuple, waits for the other connection (that is started implicitly by the C
function) that in turn waits for the locked tuple to be unlocked. Thus, the
transactions are "nested" even though they are on a different connection.

G.
%----------------------- cut here -----------------------%
-- table:
CREATE TABLE test_id (
    id serial NOT NULL PRIMARY KEY,
    retval varchar
);
-- there is a "before insert" trigger that allows retval of existing key
-- to be updated instead of inserted if retval is null (see PHP script
below)

-- plpgsql function:
CREATE PROCEDURE test_pl (int) RETURNS varchar AS '
declare
    rv varchar;
begin
    -- this can be delayed till the PHP call, but keeping here
    -- helps reproduce the problem.
    INSERT INTO test_id (id) VALUES ($1);
    rv := test_c ($1);
    rv := retval FROM test_id WHERE id = $1;
    return rv;
end;

-- C function:
text *test_c (int)
{
    ...
    system ("php -q test.php");
    ...
}

-- PHP script "test.php":
<?
    ...
    // this gets converted to UPDATE but keeping as is
    // helps reproduce the problem.
    pg_exec($conn,
            "INSERT INTO test_id (id, retval) VALUES (123, 3*123)");
    ...
?>


\end




view thread (3+ messages)

Message-ID: <003d01c4c59e$2e2d1e70$0403a8c0@fejleszt4>
Permalink:  ../003d01c4c59e$2e2d1e70$0403a8c0@fejleszt4/
Also on:    postgresql.org/message-id/003d01c4c59e$2e2d1e70$0403a8c0@fejleszt4

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: surrano@mailbox.hu, pgsql-bugs@postgresql.org
  Subject: Re: Killed backend won't rollback transaction?
  In-Reply-To: <003d01c4c59e$2e2d1e70$0403a8c0@fejleszt4>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox