|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
Добрый день! У нас периодически создаётся 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$; ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 06:25 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
a.klevtsov Хотим решить это на уровне БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 06:49 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
Он есть, по orderId. Но по остальным полям данные могут совпадать, нужно как то ограничить, что в одну секунду не могут 2 одинаковых записи создаться ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 08:36 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
a.klevtsov Он есть, по orderId. court уникальный INDEX / KEY сделай на те поля, которые характеризуют "одинаковость" записей ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:22 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
Вы видимо не так поняли или я не так объяснил. От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один. Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 07:50 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
a.klevtsov Вы видимо не так поняли или я не так объяснил. От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один. Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему? создай доп колонку по дате с округлением по секунду и на нее+все поля уникальный индекс. А проблемы в клиенте где-то понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 10:03 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
А если 1 заказ в 1.999 сек. создастся, а второй в 2.001 и округление по секунде уже не сработает ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 12:05 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
a.klevtsov А если 1 заказ в 1.999 сек. создастся, а второй в 2.001 и округление по секунде уже не сработает а если бы он вез патроны? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 13:10 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
А если создать триггер на вставку строк? Что-то типо такого: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 16:46 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
KATEROK, Не поможет... первая запись может еще не быть закомиченной и соответвенно не видимой триггеру на вторую вставку. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2021, 17:02 |
|
Добавление 2х одинаковых записей в таблицу
|
|||
---|---|---|---|
#18+
a.klevtsov Вы видимо не так поняли или я не так объяснил. От клиента приходит сразу 2 запроса одинаковых (причина пока неизвестна) с разницей во времени менее 1 сек и соответственно создаётся 2 заказа, но должен быть только один. Все поля могут быть одинаковые, кроме orderId и даты создания, но когда создаётся 2 заказа, дата создания отличается менее чем на 1 секунду. Почему вообще может приходить 2 запроса и как можно решить проблему? Так в чём дело-то? Если вам нужна заглушка, так и делайте заглушку. Пока не решите проблему в её источнике, сделайте проверку на этапе обработки заказа. Т.е. если есть два заказа от одного клиента с одинаковым набором товаров, обрабатываете заказ с наименьшим ID, а второй (третий и далее) помечаете как ложный. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2021, 12:06 |
|
|
start [/forum/topic.php?fid=53&fpage=10&tid=1993975]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 391ms |
0 / 0 |