проблема

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

проблема

Сообщение funt » 26 окт 2007, 10:16

Доброво времени суток. Интересно решение я думаю классической проблемы: существует бд в которой производиться учёт и расход чего либо, расход и приход чеголибо осуществляеться по документам (например - акт прихода, накладная). В приложение при вводе документа стартует транзакция (при чём как я понял предыдущий разработчик сделал это для "Сохранить" "Отменить") в транзакции происходят изменения "шапки" документа (№ накладной, дата и т.д.) и табличной части документа (расход чего либо в определённом кол-ве). Проблемма собственнно заключаеться в том что при формирование расхода одним пользователем, другой пользователь может израсходовать (не увидив кол-во расхода другого пользователя) больше чем существует на cамом деле (с учётом расхода первого пользователя).
х - всего было
y1 - расход первого
y2 - расход второго
х-у1-у2>=0

На сколько я знаю особенности interbase не позволяют одной транзакции увидеть изменения другой?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 окт 2007, 10:23

На сколько я знаю особенности interbase не позволяют одной транзакции увидеть изменения другой?
ни одна нормальная СУБД не дает видеть изменения, которые не committed. Если dirty read (не поддерживаемый в IB/FB) не считать за уровень изолированности.
Проблемма собственнно заключаеться в том что при формирование расхода одним пользователем, другой пользователь может израсходовать (не увидив кол-во расхода другого пользователя) больше чем существует на cамом деле (с учётом расхода первого пользователя).
нет такой проблемы. потому что расход в клиент-серверной СУБД делается не как
ostatok = x
где x - предыдущее значение ostatok минус расход.
а как
ostatok = ostatok - rashod.

что при контроле ostatok > 0 например в триггере не дает "уменьшить" остаток ниже заданного.

p.s. Вам про транзакции еще бы почитать...

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Сообщение funt » 26 окт 2007, 10:51

не совсем понял )) почему у меня нет проблемы

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 26 окт 2007, 10:55

funt писал(а):не совсем понял )) почему у меня нет проблемы
Сооруди триггер на изменение записи, либо добавь CHECK на поле в таблицу. И нет проблемы.

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Сообщение funt » 26 окт 2007, 10:56

опишу поподробней бд:
есть таблица документов, таблица приходов, таблица расходов, ну и собственно некий справочник чего либо

при формировании прихода создаёться запись в таблице документ и записИ в таблицу приход с сулкой на документ

при формирование расхода создаёться запись в таблице документ и записИ в таблице расход с сылкой на документ и запись прихода с которого делаем расход

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 окт 2007, 11:03

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 26 окт 2007, 11:06

Весь приход/расход суммируешь для проверки каждой строки?
Хм.
Сооруди, к примеру, дополнительную, агрегатную, табличку текущих остатков, и при создании строк ориентируйся на данные в ней, плюсуй/минусуй.
Заодно на базе неё можно сделать проверки. Или блокировку, если потребуется.

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Re: проблема

Сообщение funt » 26 окт 2007, 11:17

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

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Re: проблема

Сообщение funt » 26 окт 2007, 11:21

по поводу блокировок была такая идея- блокировать струку прихода с которой производиться расход и держать блокированной до момента комита транзакции, возможно ли средствами транзакции каким либо образом заблокировать доступ к строке (в другой транзакции) ?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: проблема

Сообщение WildSery » 26 окт 2007, 11:29

funt писал(а):не совсем бы хотелось агрегатную таблицу с остатками, приложение огромное...
Как только наберёшь хотя бы пару миллионов записей, у тебя анализ остатков одной позиции будет занимать уже не милисекунды. А к десятку лимонов подберёшься - будет по полчаса документ записываться.
Не вижу, причём тут "серьёзность" задачи. Как будто я что-то лекгомысленное предлагаю.

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Re: проблема

Сообщение funt » 26 окт 2007, 11:33

)) много работы будет если вводить таблицу агрегатную вот я к чеме про объём задачи оговорился, а по поводу скорости всё ок записей уже почти столько и есть- работает быстро!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 окт 2007, 11:39

Уважаемый, извиняюсь за комментарий, но нет сил больше смотреть на эти "создаёться", "обновляеться", "собираються", "сравниваються".

ни в одном этом слове мягкого знака быть не должно.
много работы будет если вводить таблицу агрегатную вот
Это Ваше личное дело, внимать или нет. Никто Вас уговаривать сделать БД по человечески не заставляет. Хотите проблем и тормозов - шпарьте дальше в том же духе.

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Сообщение funt » 26 окт 2007, 11:44

ладно ладно не горичитесь уважаемый большое вам спасибо!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: проблема

Сообщение WildSery » 26 окт 2007, 11:47

funt писал(а):по поводу блокировок была такая идея- блокировать струку прихода с которой производиться расход и держать блокированной до момента комита транзакции
Неудачная имхо идея.
Если что-то и блокировать, то только непосредственно при сохранении. Если кто создал документ и ушёл на обед (в командировку уехал), то фсё, товар более недоступен.
funt писал(а):возможно ли средствами транзакции каким либо образом заблокировать доступ к строке (в другой транзакции) ?
Читай статью о блокировках.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 окт 2007, 11:55

Читай статью о блокировках.
лучше эту читать.

http://www.ibase.ru/devinfo/pslock.htm

или вместе

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 26 окт 2007, 11:56

Лучше бы поймать какого-нибудь специалиста по складам и узнать как эту задачу решают "ручками". Сильно подозреваю, что с помошью "резервации товара" и прочих лимитов.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 26 окт 2007, 13:41

Dimitry Sibiryakov писал(а):Лучше бы поймать какого-нибудь специалиста по складам и узнать как эту задачу решают "ручками". Сильно подозреваю, что с помошью "резервации товара" и прочих лимитов.
А чего ловить-то, могу привесть вполне жизненный пример:
Звонит(факс-емыло и т.п.) клиент в коммерческую службу, делает заказ, потом манагер (в часы пик бывало и 5 чел разом) сбыта отправляются на склад набрать товар, берется стойка и на нее заказанные лапсердаки/штанишки/сарафанчики и прочие фуфайки/рукавицы вешаются-складываются. После этого подзывается оператор склада, она берет ноут в левую руку, блютусный сканер штрихкода в правую и отправляется выписывать накладнуху, прощелкала она сканером все бирки (накладная готова, выписка идет не гляда на остатки) , упаковали это добро в коробки, по факту выезда коробок за ворота делается проводка-списание (меняются остатки соответственно).
Как-то так, конфликты минимальны (хотя бывало девки тырили друг у друга набранный товар :), что бывало легче заново прощелкать бирки, чем найти что утянули, но это баловство редкое), даже когда в августе валом прет школьная форма.

funt
Сообщения: 9
Зарегистрирован: 26 окт 2007, 07:11

Сообщение funt » 26 окт 2007, 13:42

всем спасибо проблема решена

использовал блокировку на выбранные записи прихода SELECT FOR UPDATE, и перед выбором холостой апдейтесли ок то ок если нет вываливаю сообщение о том что незя списать с него временно заблокированно

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 26 окт 2007, 14:49

funt писал(а):всем спасибо проблема решена

использовал блокировку на выбранные записи прихода SELECT FOR UPDATE, и перед выбором холостой апдейтесли ок то ок если нет вываливаю сообщение о том что незя списать с него временно заблокированно
Приходи, как твои юзеры уйдут чайку попить. :wink: Оставив висеть заблокированными записи. :roll: Я чего зря чтоль сказки тебе на sql.ru рассказывал. :oops:

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 26 окт 2007, 15:17

Ivan_Pisarevsky писал(а):После этого подзывается оператор склада
Ага! Я так и знал - сериализация доступа при помощи однозадачного оператора. :lol:

Ответить