атомарно сохранить или проапдейтить

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: атомарно сохранить или проапдейтить
Date: 2012-06-20 18:32:39
Message-ID: 20120620183239.GB624@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general


приходят внешние данные с уникальным ID (uuid)

нужно эту запись либо создать, либо проапдейтить новыми значениями

делал так:

dbh->begin_work; # начали транзакцию

my $record = dbh->single( # попытка апдейта
q{
UPDATE
table
SET
some=?
WHERE
eid=?
RETURNING *
}, $val, $eid
);

unless ($record) { # инсерт после неудачи апдейта
my $record = dbh->single(
q{
INSERT INTO
table
(eid, some)

VALUES
(?, ?)
RETURNING *
}, $eid, $val
);

}

dbh->commit; # коммит транзакции

то есть в транзакции пытаемся сперва сделать апдейт имеющегося, а если
его нет в БД то затем делаем insert.

так вот при таком подходе при приходе одновременных запросов иногда
падает на втором insert'е с жалобой что такой ключ уже существует.

как правильно решить данную проблему?

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Nikolay Samokhvalov 2012-06-20 21:13:35 Re: [pgsql-ru-general] атомарно сохранить или проапдейтить
Previous Message Dmitry E. Oboukhov 2012-05-08 06:32:48 Re: Отключить русский в сообщениях об ошибках и логах