powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Актуальность остатков
25 сообщений из 45, страница 1 из 2
Актуальность остатков
    #32818872
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такая ситуация (наверное жеванная пережеванная) два пользователя одновременно проводят документы с одинаковым товаром и надо, чтобы при проведении и первым и вторым пользователем были получены верные остатки, т.е. если на остатке 5 единици и оба списывают по 5, то чтобы у одного документ не провелся. кто что может посоветовать, желательно без использования блокировок.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32818882
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
два способа
1. делаешь блокировки
2. делаешь общий процесс который формирует документ и отдает результат клиенту, все в него ломятся в порядке общей очереди

1-й вариант лучше
...
Рейтинг: 0 / 0
Актуальность остатков
    #32818957
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставить на остатки ограничение >=0
...
Рейтинг: 0 / 0
Актуальность остатков
    #32818968
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СерегаПоставить на остатки ограничение >=0
Проблема как раз возникает в тот момент, когда в промежуток времени проведения 1-го документа между получением остатков, рассчетом и фиксированием транзакции, вклинивается второ1 документ, который получает такие же остатки и тут ставь, не ставь > = 0 не помагает
...
Рейтинг: 0 / 0
Актуальность остатков
    #32818984
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
georg_kharkovПроблема как раз возникает в тот момент, когда в промежуток времени проведения 1-го документа между получением остатков, рассчетом и фиксированием транзакции, вклинивается второ1 документ, который получает такие же остатки и тут ставь, не ставь > = 0 не помагает
Как это? У тебя остатки хранятся или считаются динамически? Если 1 то поставив ограничение на количество, только один сможет зафиксировать транзакцию (кто первый встал того и тапки ), второй обломится, в смысле откатится.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819003
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
))) Предположим, нужно провести 100 рублей. И емеется таблица с остатками и таблица с проводками. На таблицу с остатками нужно навесить CHECK CONSTRAINT чтобы остаток был всегда больше нуля.
1) добавляем запись в таблицу операций
2) update OSTATOK set OSTATOK=OSTATOK+сумма проводки - одним выражеием. И - либо пан, либо пропал. Ошибка - откат транзакции. Прошло - коммит.
А выбирать сначала селектом остаток, а потом его апдейтить и без блокировок, ну это очень уж круто...я так не умею...
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819016
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не нужно таблицу остатков. Остаток надо считать по таблице проводок
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819174
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old Nickне нужно таблицу остатков. Остаток надо считать по таблице проводок
Бох в помощь...
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819197
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2gardenman:
а не долго ли будет апдейтить? учитывая количество номенклатуры 16200 плюс нужно держать в разрезе партий, что автоматом увеличивает таблицу в несколько раз, а то и десятков раз. это все не считая разреза по складам (их не много около 15)
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819206
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2simon
а на что предлагаешь ставить блокировки? (товар, регистр и т.д.)
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819238
AlexB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо проверку на количество проводить ПОСЛЕ списания. Т.е. списал в транзакции 5 штук, проверил: если >= 0, то все ОК. Иначе rollback. Это иначе как раз и значит, что кто-то успели списать данное количество пока ты думал.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819254
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexBНадо проверку на количество проводить ПОСЛЕ списания. Т.е. списал в транзакции 5 штук, проверил: если >= 0, то все ОК. Иначе rollback. Это иначе как раз и значит, что кто-то успели списать данное количество пока ты думал.
Для этого и существуют CHECK CONSTRAINT
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819290
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но ведь транзакции разные и одна выбирает остатки, пока другая не делает commit что приводит к некорректным остаткам
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819292
AlexB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, но CHECK CONSTRAINT - это по сути дела константа. А логика бизнес процесса зачастую требует наличие возможности обойти ограничение.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819321
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ниче се константа!!!
Код: plaintext
1.
2.
3.
4.
5.
	CONSTRAINT  AtBalance CHECK (
		(Type='A' AND (Active-Passive+Debet-Credit)>= 0 . 00 )
		OR (Type='P' AND (Passive-Active+Credit-Debet+Overdraft)>= 0 . 00 )
		OR (Type='M')
	)

вообще для T-SQL, где нет триггеров before CHECK CONSTRAINT - иногда единственная возможность прикрыть задницу от ошибок в "бизнес-логике"
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819373
AlexB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял

OR (Type='M')

и служит как раз для того, что бы обойти CHECK CONSTRAINT. Потому что заявленная бизнес-логика допускает и отрицательный баланс.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819389
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильно поняли)
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819667
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
georg_kharkovно ведь транзакции разные и одна выбирает остатки, пока другая не делает commit что приводит к некорректным остаткам
Вот тут по ходу дела и кроется недопонимание предложенного варината.
Дело в том, что транзакция-то одна , UPDATE OSTATOK set kolvo=kolvo + [кол-во в проводке] WHERE ... А constaint вешается как раз на kolvo>=0. И все, кто успел - тот и съел, второму вернется ошибка.

begin transaction

update проводка
set статус=проведена
where ...

update остаток
set кол-во=кол-во +/- [кол-во из проводки]
where ...

if ok then
commit
else
rollback
end if
Не нужно делать селект остатка, потом на клиенте его корректировать, а потом ставить в остаток. На сколько я понял именно в этом проблема.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819669
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer
update проводка
set статус=проведена
where ...

update остаток
set кол-во=кол-во +/- [кол-во из проводки]
where ...


А еще лучше делать триггером на изменении статуса проводки, тогда вообще одна операция.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819738
dim-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если возникнет ситуация, когда надо провести задним числом (или перепровести), а остатки, как я понимаю прииспользовании Update, только текущие и на два дня назад уже не получить.
...
Рейтинг: 0 / 0
Актуальность остатков
    #32819793
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dim-а если возникнет ситуация, когда надо провести задним числом...
Унас тоже бухи любили (пока была возможность) че-нить добавить/изменить в данных 1995,6 г и все пересчитать...

Для изменения служат корректирующие проводки...

В принципе, для незакрытых периодов можно менять больше/менше, но все таки минуса быть не должно... не отменять же другие проводки...
Вот только кроме количества обычно есть и цена, которая может меняться...

dim-...а остатки, как я понимаю при использовании Update, только текущие и на два дня назад уже не получить.
Для этого используется хранение остатков на начало/конец периода (обычно месяц), а с точностью до дня - кому это нужно?...
Хотя взяв начало периода можно все проводки разложить по дням...
...
Рейтинг: 0 / 0
Актуальность остатков
    #32820019
-----
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ololДля этого используется хранение остатков на начало/конец периода (обычно месяц), а с точностью до дня - кому это нужно?...Например банкам нужно. У них баланс составляется каждый день, а не раз в месяц
...
Рейтинг: 0 / 0
Актуальность остатков
    #32820028
georg_kharkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для этого используется хранение остатков на начало/конец периода (обычно месяц), а с точностью до дня - кому это нужно?...
Хотя взяв начало периода можно все проводки разложить по дням...

И как раз тут то и теряется возможность использовать CHECK
...
Рейтинг: 0 / 0
Актуальность остатков
    #32820125
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО. Хранение текущих остатков никак не влияет на получение остатков на любую дату в прошлом. Может быть дале облегчает эту задачу, если считать за "немного назад".
...
Рейтинг: 0 / 0
Актуальность остатков
    #32820244
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СерегаИМХО. Хранение текущих остатков никак не влияет на получение остатков на любую дату в прошлом. Может быть дале облегчает эту задачу, если считать за "немного назад".

Сказано же, Упростил задачу до невозможности
Т.е. тут не задача важна а ПРИНЦИП, СПОСОБ её ренения...
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Актуальность остатков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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