On 1/19/2015 4:58 PM, Robert DiFalco wrote:
Hometowns get selected and possibly inserted in unpredictable ways
even from multiple concurrent sessions. The only way I could figure
out how to solve it was to force each INSERT hometowns to be in its
own transaction.
So you fixed it - good. In our situation we were never inserting more
than one hometown** record in the same transaction - so I see now that
my scenario was not the same as yours - but yours evolved to that.
(**using "hometown" for our record type)
On Mon, Jan 19, 2015 at 1:56 PM, Robert DiFalco
<robert.difa...@gmail.com <mailto:robert.difa...@gmail.com>> wrote:
I don't think an advisory lock would remove the deadlock.
For 2 or more hometown inserts per transaction - I agree - it won't fix it.
Glad to hear you have it fixed.
Roxanne
On Sun, Jan 18, 2015 at 10:33 PM, Roxanne Reid-Bennett
<r...@tara-lu.com <mailto:r...@tara-lu.com>> wrote:
On 1/16/2015 2:41 AM, Jim Nasby wrote:
On 1/15/15 10:57 PM, Roxanne Reid-Bennett wrote:
try this: (if you still get deadlocks, uncomment the
advisory lock [thanks Daniel] and try again)
Logically I suppose it might run faster to do the
select, then insert "if". I almost always write these
as insert first - because it's the more restrictive lock.
CREATE OR REPLACE FUNCTION
select_hometown_id(hometown_name VARCHAR) RETURNS
INTEGER AS
$BODY$
DECLARE
v_id integer;
BEGIN
-- perform
pg_advisory_xact_lock(hashtext(hometown_name));
BEGIN
insert into hometowns (name)
select hometown_name where not exists (select
id from hometowns where name = hometown_name)
returning id into v_id;
That has a race condition. The only safe way to do this
(outside of SSI) is using the example code at
http://www.postgresql.org/docs/devel/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
And if the advisory lock is used? That presumably creates an
exclusive lock on the asset "hometown_name". [in most examples
given "Portland, OR".] Would not any other process that runs
(this function) on the same asset have to wait for this
specific transaction to commit or roll back - blocking the
race condition?
Roxanne
(sorry, I was out of town)
--
Sent via pgsql-general mailing list
(pgsql-general@postgresql.org
<mailto:pgsql-general@postgresql.org>)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general
--
[At other schools] I think the most common fault in general is to teach
students how to pass exams instead of teaching them the science.
Donald Knuth