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

1-й вариант лучше
...
Рейтинг: 0 / 0
08.12.2004, 15:22
    #32818957
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
Поставить на остатки ограничение >=0
...
Рейтинг: 0 / 0
08.12.2004, 15:26
    #32818968
georg_kharkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
СерегаПоставить на остатки ограничение >=0
Проблема как раз возникает в тот момент, когда в промежуток времени проведения 1-го документа между получением остатков, рассчетом и фиксированием транзакции, вклинивается второ1 документ, который получает такие же остатки и тут ставь, не ставь > = 0 не помагает
...
Рейтинг: 0 / 0
08.12.2004, 15:31
    #32818984
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
georg_kharkovПроблема как раз возникает в тот момент, когда в промежуток времени проведения 1-го документа между получением остатков, рассчетом и фиксированием транзакции, вклинивается второ1 документ, который получает такие же остатки и тут ставь, не ставь > = 0 не помагает
Как это? У тебя остатки хранятся или считаются динамически? Если 1 то поставив ограничение на количество, только один сможет зафиксировать транзакцию (кто первый встал того и тапки ), второй обломится, в смысле откатится.
...
Рейтинг: 0 / 0
08.12.2004, 15:38
    #32819003
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
))) Предположим, нужно провести 100 рублей. И емеется таблица с остатками и таблица с проводками. На таблицу с остатками нужно навесить CHECK CONSTRAINT чтобы остаток был всегда больше нуля.
1) добавляем запись в таблицу операций
2) update OSTATOK set OSTATOK=OSTATOK+сумма проводки - одним выражеием. И - либо пан, либо пропал. Ошибка - откат транзакции. Прошло - коммит.
А выбирать сначала селектом остаток, а потом его апдейтить и без блокировок, ну это очень уж круто...я так не умею...
...
Рейтинг: 0 / 0
08.12.2004, 15:47
    #32819016
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
не нужно таблицу остатков. Остаток надо считать по таблице проводок
...
Рейтинг: 0 / 0
08.12.2004, 16:40
    #32819174
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
Old Nickне нужно таблицу остатков. Остаток надо считать по таблице проводок
Бох в помощь...
...
Рейтинг: 0 / 0
08.12.2004, 16:46
    #32819197
georg_kharkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
2gardenman:
а не долго ли будет апдейтить? учитывая количество номенклатуры 16200 плюс нужно держать в разрезе партий, что автоматом увеличивает таблицу в несколько раз, а то и десятков раз. это все не считая разреза по складам (их не много около 15)
...
Рейтинг: 0 / 0
08.12.2004, 16:49
    #32819206
georg_kharkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
2simon
а на что предлагаешь ставить блокировки? (товар, регистр и т.д.)
...
Рейтинг: 0 / 0
08.12.2004, 17:02
    #32819238
AlexB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
Надо проверку на количество проводить ПОСЛЕ списания. Т.е. списал в транзакции 5 штук, проверил: если >= 0, то все ОК. Иначе rollback. Это иначе как раз и значит, что кто-то успели списать данное количество пока ты думал.
...
Рейтинг: 0 / 0
08.12.2004, 17:06
    #32819254
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
AlexBНадо проверку на количество проводить ПОСЛЕ списания. Т.е. списал в транзакции 5 штук, проверил: если >= 0, то все ОК. Иначе rollback. Это иначе как раз и значит, что кто-то успели списать данное количество пока ты думал.
Для этого и существуют CHECK CONSTRAINT
...
Рейтинг: 0 / 0
08.12.2004, 17:23
    #32819290
georg_kharkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
но ведь транзакции разные и одна выбирает остатки, пока другая не делает commit что приводит к некорректным остаткам
...
Рейтинг: 0 / 0
08.12.2004, 17:23
    #32819292
AlexB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
Да, но CHECK CONSTRAINT - это по сути дела константа. А логика бизнес процесса зачастую требует наличие возможности обойти ограничение.
...
Рейтинг: 0 / 0
08.12.2004, 17:34
    #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
08.12.2004, 17:52
    #32819373
AlexB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
Как я понял

OR (Type='M')

и служит как раз для того, что бы обойти CHECK CONSTRAINT. Потому что заявленная бизнес-логика допускает и отрицательный баланс.
...
Рейтинг: 0 / 0
08.12.2004, 17:57
    #32819389
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
правильно поняли)
...
Рейтинг: 0 / 0
08.12.2004, 22:35
    #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
08.12.2004, 22:37
    #32819669
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Актуальность остатков
iLLer
update проводка
set статус=проведена
where ...

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


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

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

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

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

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

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


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