Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для efi0p
0 / 0 / 1
Регистрация: 02.03.2022
Сообщений: 29

Событие в базе данных Postgresql

27.03.2023, 19:27. Показов 900. Ответов 12

Студворк — интернет-сервис помощи студентам
Задача - есть User, который покупает товар, у пользователя списываются деньги, но пользователь в течении 20 минут может отказаться, или вообще не получить услугу.

У товара есть статус который будет либо активный, либо завершенный, либо отменённый.

Как бы сделать чтобы по истечению 20 мин при отсутствии действий покупателя статус переходил в состояние закрытого и пользователю возвращались деньги на счёт?

Использую базу данных Postgresql
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2023, 19:27
Ответы с готовыми решениями:

PostgreSQL не получается подключиться к базе данных
Добрый день, форумчане! Для подключения к базе данных использую Npgsql. Если подключаться к базе по умолчанию, то все проходит без...

Php + postgresql поиск по базе данных
Народ ну подскажите плиз, ни как не могу понять как допилить. Что нужно: 1. Есть большая база данных 2. Необходимо из неё выдернуть...

Php+postgresql поиск по базе данных
Народ ну подскажите плиз, ни как не могу понять как допилить. Что нужно: 1. Есть большая база данных 2. Необходимо из неё выдернуть...

12
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,681
Записей в блоге: 3
27.03.2023, 20:59
Цитата Сообщение от efi0p Посмотреть сообщение
может отказаться, или вообще не получить услугу
ИЛИ или И?
Цитата Сообщение от efi0p Посмотреть сообщение
закрытого и пользователю возвращались деньги на счёт
С чего бы это закрытого, если деньги вернулись назад?
efi0p, ты сам то понял что за каламбур понаписал?
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
28.03.2023, 01:36
а причем тут база?
запускаете таску в коде и ждёте 20 минут
0
 Аватар для efi0p
0 / 0 / 1
Регистрация: 02.03.2022
Сообщений: 29
28.03.2023, 12:18  [ТС]
Насчёт таски в коде я тоже подумал в первую очередь, но если сервер упадёт или перезагрузиться, то вся эта логика вместе с таской пропадёт и в таком случаи не будет возвращён баланс на счёт клиента.
Речь идёт про asp.net приложение, + мне нужно вернуть результат операции не через 20 мин, а сразу о том что всё окей заказ создан и детали заказа
Первый раз реализую подобный функционал, спросить не у кого, поэтому прошу не судить строго.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
28.03.2023, 13:20
Цитата Сообщение от efi0p Посмотреть сообщение
Как бы сделать чтобы по истечению 20 мин при отсутствии действий покупателя статус переходил в состояние закрытого и пользователю возвращались деньги на счёт?
Представьте, вот вы покупаете товар в ДНС-е, заплатили 20тыщ за 2терабайта SSD, завтра планируете заехать, забрать, но нет - через 20 минут вам деньги обратно возвращаются.

Добавлено через 4 минуты
Цитата Сообщение от efi0p Посмотреть сообщение
по истечению 20 мин при отсутствии действий покупателя
Какие действия ожидаются от пользователя, после того, как он уже совершил самое важное действие для системы - ОПЛАТИЛ товар?
Станцевать буги-вуги, предвкушая распаковку товара?

Добавлено через 5 минут
efi0p, для начала продумайте внимательно статусную модель заказа.
0
 Аватар для efi0p
0 / 0 / 1
Регистрация: 02.03.2022
Сообщений: 29
28.03.2023, 13:33  [ТС]
В целом цепочка такая
1 - пользователь делает заказ
2 - asp приложение создаёт в базе данных заказ, списывает деньги с баланса пользователя и возвращает ответ что всё ок заказ создан, дополнительная информация по заказу.
3 - Пользователь не получает услугу и не производит никаких действий отмены.
4 - Проходит условные 20 мин, услуга считается не активной т.к. оказания услуги не произошло, не по вине пользователя.
5 - Необходимо вернуть пользователю деньги на счёт т.к. услуга не была оказана за этот промежуток времени и состояния заказа по времени уже закрыто, то есть услугой этой пользователь воспользоваться уже не сможет.

Как я понимаю создать не ожидаемую таску и вернуть ответ что всё ок, это полный бред, т.к. за это время может случиться всё что угодно, упасть сервер вылететь ошибка т.д. и где хранить эти таски если вдруг сервер уйдёт в перезагрузку, в этом случае всей логике хана и деньги не вернуться на счёт пользователя.

Соответственно это нужно делать в бд где будет храниться логика этих событий.

Скорее всего я не правильно рассуждаю и задача решается просто, но пока я не вижу никаких решений, смотрю в сторону pg_cron

Добавлено через 8 минут
Буги вуги не нужно, достаточно просто либо подтвердить получение услуги или отменить её, но в случае не оказания услуги пользователь не должен орать в сервер что верните деньги и всё такое, они автоматически вернуться ему на счёт, вот такая задача.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
28.03.2023, 13:47
Цитата Сообщение от efi0p Посмотреть сообщение
и деньги не вернуться на счёт пользователя.
Да, верно. Все критичные данные (например в финтехе) всегда персистятся на диск, в базу и т.д. Те же СУБД c транзакционностью, часто поддерживают WAL (Write Ahead Logs), то есть перед запуском транзакции записывают все действия, которые должны быть произведены, на диск.
Пусть наш заказ, это не просто какой-то товар, это критичная по времени исполнения услуга, BoundedOrder, у него есть статусы:
C#
1
2
3
4
5
6
7
8
9
10
pubilc enum BoundedOrderStatus
{
   Reserved, //пользователь сохранил в корзину - то есть единица услуги изымается из общего пула услуг, 
   //если это ваш случай, просто фантазирую
   Paid,
   WaitForDelivery,
   Delivered, //Completed по-вашему
   Cancelled, //отменено пользователем
   TimedOut //не доставлено вовремя
}
Ну и просто создавайте свой заказ, типа того:
C#
1
2
3
4
5
class BoundedOrder {
   public BoundedOrderStatus Status { get; private set; }
   public DateTime? ReserveTimetrace {get; private set;}
   public DateTime? PaidTimetrace {get; private set;}
}
Соответственно при оплате мгновенно заносите в базу, запускаете таску, которая с таймаутом 20 минут с момента покупки отменяет этот заказ. Самой таске передает CancellationToken, который этменяет эту таску при необходимости.
Если пользователь каким-то образом получил услугу/сам отменил ее, то отменяете таску автоматической отмены заказа. Ну в общих чертах как-то так.

Добавлено через 1 минуту
Ну и условное время доставки услуги назовем DeliveryTimeout - будем брать это значение из настроек.
0
Valechka-Думай о Высоком
 Аватар для Ludwig Valentin
171 / 290 / 26
Регистрация: 11.08.2022
Сообщений: 3,713
28.03.2023, 13:49
Пусть подтверждает перевод денег сознательно отдельной кнопкой.
А возврат через службу поддержки только.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
28.03.2023, 13:52
Тут можно по-разному проектировать. Можно держать все заказы в одной таблице.
1. Можно активные в одной, отмененные в другой, выполненные в третьей, недосставленные вовремя - в четвертой.
Тут EF-овский TPC очень хорошо зайдет (когда один базовый абстрактный класс, и 4 производных - под каждую таблицу).
2. А можно просто кучей держать все в одной таблице.
0
 Аватар для efi0p
0 / 0 / 1
Регистрация: 02.03.2022
Сообщений: 29
28.03.2023, 14:42  [ТС]
Видимо я не понял вашу мысль..

Вот чисто абстрактный пример

Но это же совершено точно бред...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 [HttpPost]
        public ActionResult<Order> Post([FromBody] string value)
        {
            var boundedOrder = new BoundedOrder(DateTime.Now.AddMinutes(20), BoundedOrderStatus.WaitForDelivery);
            var order = new Order(boundedOrder);
            _dbCon.Add(order);
            _dbCon.SaveChanges();
 
            Task.Factory.StartNew(() =>
            {
                /// Task.Deleay(20min);
                /// Если логика предполагает что нужно вернуть деньги -  возвращаем деньги
            });
            return order;
         }
 
    }
 
    class Order
    {
        public Order(BoundedOrder boundedOrder)
        {
            BoundedOrder = boundedOrder;
        }
        int Id { get; set; }
        public BoundedOrder BoundedOrder { get; set; }
        public string AnyValue { get; set; }
    }
    
    class BoundedOrder
    {
        public BoundedOrder
            (DateTime paidTimetrace, BoundedOrderStatus boundedOrderStatus)
        {
            PaidTimetrace = paidTimetrace;
            Status = boundedOrderStatus;
        }
        public BoundedOrderStatus Status { get; private set; }
        public DateTime? ReserveTimetrace { get; private set; }
        public DateTime? PaidTimetrace { get; private set; }
    }
 
    enum BoundedOrderStatus
    {
        Reserved, //пользователь сохранил в корзину - то есть единица услуги изымается из общего пула услуг, 
                  //если это ваш случай, просто фантазирую
        Paid,
        WaitForDelivery,
        Delivered, //Completed по-вашему
        Cancelled, //отменено пользователем
        TimedOut //не доставлено вовремя
    }
Иначе вот откуда приложение может получить сигнал что время этого заказа вышло и нужно вернуть деньги, если никто кроме бд этого сигнала выдать не может.. т.к. там храниться информация о том когда выйдет время заказа.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
28.03.2023, 15:05
Task.Factory.StartNew(() =>
{
/// Task.Delay(20min);
/// Если логика предполагает что нужно вернуть деньги - возвращаем деньги
});
return order;
Все тут нормально, только я бы тут определил какой-нибудь IOrderProcessingService, который бы, например, имел метод:
C#
1
2
3
4
5
6
7
EnqueueOrderProcessing(OrderProcessing processing)
{
   var task =   Task.Run(() => {});
   task.ContinueWIth(() => {...}, TaskContinuationOptions.OnlyOnCancelled); //заказ была отменен пользователем, либо доставлен успешно
   task.ContinueWIth(() => {}, TaskContinuationOptions.OnlyOnRanToCompletion) //заказ был TimedOut
   //в каждом своя логика
}
Возможно, вы просто не видите всю картину. Если честно, не хочется дальше распинаться.
Попробуйте придумать что-нибудь свое.
ЗЫ: + еще одна возможная сущность в базу - OrderProcessing - куда можно заносить информацию о результатах обработки (Cancelled, Deliviered, Exception).
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
28.03.2023, 15:14
Цитата Сообщение от efi0p Посмотреть сообщение
Насчёт таски в коде я тоже подумал в первую очередь, но если сервер упадёт или перезагрузиться, то вся эта логика вместе с таской пропадёт и в таком случаи не будет возвращён баланс на счёт клиента.
Речь идёт про asp.net приложение, + мне нужно вернуть результат операции не через 20 мин, а сразу о том что всё окей заказ создан и детали заказа
Первый раз реализую подобный функционал, спросить не у кого, поэтому прошу не судить строго.
для этого есть редис
который и будет хранить состояние
а таска просто проверять что да как
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
28.03.2023, 15:23
Цитата Сообщение от efi0p Посмотреть сообщение
может получить сигнал что время этого заказа вышло и нужно вернуть деньги, если никто кроме бд этого сигнала выдать не может...
Строка 5 из кода выше. Если сервис перезапускался, то инициализировать и запускать повторно IOrderProcessingService на основе таблицы активных заказов, делая соответствующие проверки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2023, 15:23
Помогаю со студенческими работами здесь

Подключение Python к Базе Данных PostgreSQL и ее отображение в PyQt5
Здравствуйте уважаемые!:coffee: Дали задание по курсовой, в которой по мимо самой курсовой нужно сделать : 1)БД (Сделал на PostgreSQL) ...

Как подключиться к базе данных Postgresql на локальном сервере?
Доброго времени суток. Подскажите, пожалуйста. У меня есть приложение, которое взаимодействует с БД PostgreSQL. conn =...

Как обновить таблицы в Базе данных PostgreSQL, из полученного DataSet
В начале я загружаю в DataSet 6 таблиц, потом редактирую. Если я только добавляю строку то она сохраняется, но если есть удаленные или...

Проблема подключения к базе данных PostgreSQL с PyQt5.QtSql. Драйвер не загружен
Добрый день, кто-нибудь может подсказать что делать? Пытаю подключиться к базе PostgreSQL с PyQt5.QtSql но вылетает сообщение что драйвер...

Событие на изменение данных в базе
Всем привет! Возникла задача: необходимо настроить некий триггер/ивент который будет срабатывать при изменении базы данных, после чего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru