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
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: Отключить русский в сообщениях об ошибках и логах |