Re: Simple Atomic Relationship Insert

Поиск
Список
Период
Сортировка
От Robert DiFalco
Тема Re: Simple Atomic Relationship Insert
Дата
Msg-id CAAXGW-wGT5Csnx4K7wJZm-nGvGKugrKvgy8JBatzLzFdWtTa-w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Simple Atomic Relationship Insert  ("Daniel Verite" <daniel@manitou-mail.org>)
Список pgsql-general
Is there a way to force a new private transaction in a FUNCTION? That seems like it would be a good solution here because I could simply do the insert in the RAISE within its own private transaction. Then on the next iteration of the loop (as long as I don't have repeatable reads) it should be picked up. And there should only be a quick recoverable deadlock.

On Fri, Jan 16, 2015 at 7:49 AM, Daniel Verite <daniel@manitou-mail.org> wrote:
        Robert DiFalco wrote:

> I must be doing something wrong because both of these approaches are giving
> me deadlock exceptions.

Deadlocks are to be expected if the INSERTs are batched within a single
transaction and there are several sessions doing this in parallel.

Given that there's an unique constraint on hometowns(name), if this sequence
happens (not even considering the "users" table to simplify):

Session #1:  begin;
Session #2:  begin;
Session #1:  insert into hometowns(name) values('City1');
Session #2:  insert into hometowns(name) values('City2');
Session #1:  insert into hometowns(name) values('City2');
  => Session #1 is put to wait until Session #2 commits or rollbacks
Session #2:  insert into hometowns(name) values('City1');
  => Session #2 should wait for Session #1 which is already waiting for
Session #2: that's a deadlock


It does not mean that the code meant to insert one user and the town without
race condition is incorrect by itself. The unique_violation handler is not
called in this scenario because the candidate row is not yet committed by the
other session. This would work in an OLTP scenario when each "user" is
commited after processing it.

Avoiding deadlocks between parallel batches is a different problem than
avoiding race conditions. If you have the above issue, I don't think you may
solve it by tweaking the code of an individual process. It needs to be
rethought at the level above, the one that initiates this in parallel and
dictates the commit strategy.

Best regards,
--
Daniel
PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org


--
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 по дате отправления:

Предыдущее
От: Adrian Klaver
Дата:
Сообщение: Re: sslcompression / PGSSLCOMPRESSION not behaving as documented?
Следующее
От: Peter Hicks
Дата:
Сообщение: Alternatives to a unique indexes with NULL