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

Поиск
Список
Период
Сортировка
От Dmitry E. Oboukhov
Тема атомарно сохранить или проапдейтить
Дата
Msg-id 20120620183239.GB624@vdsl.uvw.ru
обсуждение исходный текст
Список 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@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Вложения

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: "Dmitry E. Oboukhov"
Дата:
Сообщение: Re: Отключить русский в сообщениях об ошибках и логах
Следующее
От: Nikolay Samokhvalov
Дата:
Сообщение: Re: [pgsql-ru-general] атомарно сохранить или проапдейтить