2015-06-28 6:37 GMT+02:00 Larry Meadors <larry.mead...@gmail.com>:

> I'm running this SQL statement:
>
> insert into Favorite (patronId, titleId)
> select 123, 234
> where not exists (
>   select 1 from Favorite where patronId = 123 and titleId = 234
> )
>
> It normally runs perfectly, but will rarely fail and I just can't see
> any way that it could. :-|
>
> The exception I get is that the unique key (patronid+titleid) was violated.
>
> Is it possible that the statement is getting run twice and that the
> timing is such that the first one succeeds and the second tries to do
> the insert and fails because the select part of the SQL ran before the
> first insert completed? I'd expected that each of the two would be
> single operations, but this error is making me rethink that.
>

sure - it is expected behave

http://www.postgresql.org/docs/9.4/static/transaction-iso.html

you can protect it against this issue with locking - in this case you can
try "for update" clause

http://www.postgresql.org/docs/9.4/static/explicit-locking.html

insert into Favorite (patronId, titleId)
select 123, 234
where not exists (
  select 1 from Favorite where patronId = 123 and titleId = 234 for update
)

Regards

Pavel


>
> Any thoughts?
>
> Larry
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

Reply via email to