From: | Jim Nasby <Jim(dot)Nasby(at)BlueTreble(dot)com> |
---|---|
To: | Roxanne Reid-Bennett <rox(at)tara-lu(dot)com>, <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Simple Atomic Relationship Insert |
Date: | 2015-01-16 07:41:00 |
Message-ID: | 54B8C08C.8000609@BlueTreble.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
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
--
Jim Nasby, Data Architect, Blue Treble Consulting
Data in Trouble? Get it in Treble! http://BlueTreble.com
From | Date | Subject | |
---|---|---|---|
Next Message | Rémi Cura | 2015-01-16 08:40:24 | Re: Indexing large table of coordinates with GiST |
Previous Message | Jim Nasby | 2015-01-16 07:39:12 | Re: Proper use of pg_xlog_location_diff() |