powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Добавление 2х одинаковых записей в таблицу
11 сообщений из 11, страница 1 из 1
Добавление 2х одинаковых записей в таблицу
    #40077047
a.klevtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! У нас периодически создаётся 2 одинаковые записи в таблице с разницей во времени примерно .0002 сек. Возможно приходит 2 запроса, но отловить не можем. Хотим решить это на уровне БД.
Как правильно сделать блокировку? Чтобы добавлялась только одна запись

-- Функция предназначена для того, чтобы некие повторяющиейся и паралельные действия блокировать
CREATE OR REPLACE FUNCTION dbo.fn_lock_various_datum_block(
_accid integer,
_name text,
_value text,
_value_if_null text)
RETURNS text
LANGUAGE 'sql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$

WITH sel AS (
SELECT data
FROM variousdata
WHERE name = _name
LIMIT 1
),
upd AS (
UPDATE variousdata
SET data = _value
WHERE name = _name AND EXISTS(SELECT * FROM sel)
RETURNING data
),
ins AS (
INSERT INTO variousdata(data, name, accountid)
SELECT _value, _name, _accid
WHERE NOT EXISTS(SELECT * FROM sel)
RETURNING data
)
SELECT COALESCE(sel.data, _value_if_null)
FROM (SELECT 0) z
FULL JOIN sel ON (true)
FULL JOIN ins ON (true)
LIMIT 1;
$BODY$;
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077048
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.klevtsov
Хотим решить это на уровне БД.
уникальный INDEX / KEY сделай на те поля, которые характеризуют "одинаковость" записей
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077059
a.klevtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Он есть, по orderId. Но по остальным полям данные могут совпадать, нужно как то ограничить, что в одну секунду не могут 2 одинаковых записи создаться
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077081
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.klevtsov
Он есть, по orderId.

court
уникальный INDEX / KEY сделай на те поля, которые характеризуют "одинаковость" записей
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077451
a.klevtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы видимо не так поняли или я не так объяснил.
От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один.
Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему?
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077459
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.klevtsov
Вы видимо не так поняли или я не так объяснил.
От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один.
Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему?

создай доп колонку по дате с округлением по секунду и на нее+все поля уникальный индекс.

А проблемы в клиенте где-то понятно
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077476
a.klevtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если 1 заказ в 1.999 сек. создастся, а второй в 2.001 и округление по секунде уже не сработает
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077483
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.klevtsov
А если 1 заказ в 1.999 сек. создастся, а второй в 2.001 и округление по секунде уже не сработает

а если бы он вез патроны?
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077519
KATEROK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если создать триггер на вставку строк?
Что-то типо такого:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION ins_check() RETURNS trigger AS $ins_check$
    BEGIN
        IF NEW.order_time - (SELECT MAX(order_time)
            FROM orders
            WHERE customer = NEW.customer) < interval '00:00:02' THEN
            RAISE EXCEPTION 'double inserting';
        END IF;
        RETURN NEW;
    END;
$ins_check$ LANGUAGE plpgsql;

CREATE TRIGGER ins_check BEFORE INSERTE ON orders
    FOR EACH ROW EXECUTE FUNCTION ins_check();
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077521
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KATEROK,

Не поможет... первая запись может еще не быть закомиченной и соответвенно не видимой триггеру на вторую вставку.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Добавление 2х одинаковых записей в таблицу
    #40077606
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.klevtsov
Вы видимо не так поняли или я не так объяснил.
От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один.
Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему?


Так в чём дело-то? Если вам нужна заглушка, так и делайте заглушку. Пока не решите проблему в её источнике, сделайте проверку на этапе обработки заказа. Т.е. если есть два заказа от одного клиента с одинаковым набором товаров, обрабатываете заказ с наименьшим ID, а второй (третий и далее) помечаете как ложный.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Добавление 2х одинаковых записей в таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]