Re: Simple Atomic Relationship Insert - Mailing list pgsql-general

From Robert DiFalco
Subject Re: Simple Atomic Relationship Insert
Date
Msg-id CAAXGW-zHYnZVbzw6rn=LZqjsbLnAQdy4yTa8c684aqXB4uFXyQ@mail.gmail.com
Whole thread Raw
In response to Re: Simple Atomic Relationship Insert  (Roxanne Reid-Bennett <rox@tara-lu.com>)
List pgsql-general
I don't think an advisory lock would remove the deadlock. 

On Sun, Jan 18, 2015 at 10:33 PM, Roxanne Reid-Bennett <rox@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)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

pgsql-general by date:

Previous
From: Robert DiFalco
Date:
Subject: Re: Simple Atomic Relationship Insert
Next
From: Stefan Keller
Date:
Subject: Re: splitting up tables based on read/write frequency of columns