|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafmvill_agerне представляю, как можно зарезервировать товар без блокировки это забота СУБД. Образно: Код: plaintext
qty - резервируемое количество onhandqty - доступное количество ограничение: resqty <= onhandqty. если несколько клиентов захотят забрать последнюю единицу товара - что получится? или после резервирования опять проверять наличие? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 20:51 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_agerесли несколько клиентов захотят забрать последнюю единицу товара - что получится? или после резервирования опять проверять наличие? у первого резерв будет принят, остальные получат отвод. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 21:18 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafmvill_agerесли несколько клиентов захотят забрать последнюю единицу товара - что получится? или после резервирования опять проверять наличие? у первого резерв будет принят, остальные получат отвод. получается неявная блокировка но может наверное и так получится: проверяем наличие потом резервируем но за этот промежуток кто-то уже забрал наш товар. а вариант блокировка, если получилось: проверка наличия резервирование снятие блокировки сработает железно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 21:35 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_ager блокировка, если получилось: проверка наличия резервирование снятие блокировки сработает железно блокировка чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 23:34 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafmvill_ager блокировка, если получилось: проверка наличия резервирование снятие блокировки сработает железно блокировка чего? whonhand ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 23:38 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_ager, update... а база данных сама прекрасно справляется с тем, за что отвечает. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 23:42 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafm, если можно, поясните я не слишком знаком с принципом работы update (к сожалению :( ) учусь, можно сказать (выбираюсь из Foxpro :) в моем представлении update без проблем увеличит количество зарезервированного товара но ответа на вопрос - есть ли товар в наличии? - он не дает еще раз пример: одна единица товара, трое операторов увидели на экране остаток, и подтвердили расход что получится? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2009, 23:50 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_ager, для таблицы whonhand определено ограничение (resqty <= onhandqty), constraint... т.е. количество зарезервированного товара самой СУБД не допускается больше чем остаток. Именно это ограничение и определяет возможность дальнейших действий. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 00:02 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafm, таки неявная блокировка :) и условие constraint может быть любым? я обычно вообще не держу таблицы с остатками и и резервом-все находится в одной таблице прихода-расхода, и для того чтобы узнать остаток просто суммируется поле количества спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 00:13 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_agerучусь, можно сказать (выбираюсь из Foxpro :)Быстрее переходите на нормальные СУБД ;) vill_agerв моем представлении update без проблем увеличит количество зарезервированного товара но ответа на вопрос - есть ли товар в наличии? - он не даетНа этом update может триггер висеть, который выдаст ошибку при отсутствии товара в наличии. Вообще, это может быть и не update а более сложная хранимая процедура. Важно, чтобы она исполнялась в транзакции с правильным уровнем изоляции. Т.е. последовательность такая: запуск транзакции резервирование (при этом триггер проверяет, есть ли остаток, и ни в коем случае не проверяйте остаток селектом) фиксация транзакции Если на каком-то этапе произошла ошибка, то транзакция просто откатывается vill_agerеще раз пример: одна единица товара, трое операторов увидели на экране остаток, и подтвердили расход что получится? Стартуют три транзакции. При выполнении update сервер автоматом ставит неразделяемую блокировку на запись. Соответственно, только одна из транзакций сможет выполнить этот update. Остальные засыпают. Та транзакция, которой повезло, делает коммит и сообщает об этом счастливому юзеру. В этот момент сервер автоматом снимает с записи блокировку. Просыпаются обе ожидающие ее транзакции. Пытаются сделать update. Та которой повезло больше, его выполняет, что приводит к простановке блокировки. Третья транзакция снова засыпает. Но тут срабатывает триггер, который говорит, что на складе уже ноль и отрицательным остаток быть не может. Ошибка возвращается юзеру и транзакция откатывается. В момент отката (как и при коммите) автоматом снимаются все проставленные транзакцией блокировки. Тут просыпается третья транзакция, пытается сделать update, но триггер не спит и выдает ошибку. Третий юзер тоже получает откат транзакции. Важно помнить, что никогда не проверяйте остаток селектом. На селект не ставится блокировка (вернее ставится, но разделяемая и это зависит от реализации сервера). То есть несколько транзакций могут делать селект не блокируя друг-друга. Сразу делайте апдейт, делет или инсерт и проверки выполняйте в триггере. А вообще, запустите на компе три консоли, настройте их, чтобы они не делали автокоммит после выполнения каждой команды, стартуйте вручную транзакции и выполните апдейт одной и той-же записи из разных консолей. Вы увидете блокировки в действии. Выполните в одной консоли коммит или роллбак. Вы увидите снятие блокировок в действии. Поиграйтесь с констрейнами уникальности по полю: создайте таблицу, в которой есть уникальный ключ. Из одной консоли вставьте запись, потом из другой консоли попробуйте вставить запись с таким-же ключем. Думаете, сервер должен выдать ошибку? Он не может... Он просто заблокирует вторую транзакцию, т.к. не знает, что делать. Если первая консоль транзакцию откатит, тогда вторая сможет выполнить операцию. Если первая консоль транзакцию коммитит, тогда вторая должна выдать сообщение об ошибке дублирования ключей. Забывайте про свой Foxpro и добро пожаловать в мир декларативного описания целостности данных и автоматической поддержки транзакций в разных режимах изолированности. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 00:44 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_agerя обычно вообще не держу таблицы с остатками и и резервом-все находится в одной таблице прихода-расхода, и для того чтобы узнать остаток просто суммируется поле количестваА вот это плохо. Если одновременно стартуют несколько транзакций, то они могут суммировать независимо друг от друга и друг-другу не мешать. Но если надо не только просуммировать, но и блокировать остаток, то тут нужна отдельная запись с остатком. Можно повесить триггер на таблицу прихода-расхода, который будет автоматом корректировать остатки. Т.е. вы просто вставляете запись "расход со склада", срабатывает триггер, который быстро выясняет, что в итоге получился отрицательный остаток, и выдает ошибку. Транзакция откатывается. Причем, просто просуммировать остаток недостаточно, его еще надо записать в таблицу остатков. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 00:57 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Dmitry V. LiseevА вот это плохо. Если одновременно стартуют несколько транзакций, то они могут суммировать независимо друг от друга и друг-другу не мешать. Но если надо не только просуммировать, но и блокировать остаток, то тут нужна отдельная запись с остатком. Можно повесить триггер на таблицу прихода-расхода, который будет автоматом корректировать остатки. Т.е. вы просто вставляете запись "расход со склада", срабатывает триггер, который быстро выясняет, что в итоге получился отрицательный остаток, и выдает ошибку. Транзакция откатывается. Причем, просто просуммировать остаток недостаточно, его еще надо записать в таблицу остатков. может и плохо. чтобы блокировать остаток нужно записать в таблицу прихода-расхода строку о расходе(обычно со статусом резерв) а как с таблицей остатков организовать такую работу: кончился месяц, бухи обрабатывают документацию, делают списание но - пошел приход нового месяца, который не должен быть виден в прошлом или торговля - кончается день, выписка идет, уже есть завтрашний приход (бывает такое), и операторы забивают заявки на завтра. завтрашний приход не должен быть виден в сегодня - продавать его нельзя выход - заблокировать таблицу прихода-расхода от изменений, просуммировать по нужную дату, записать расход, отпустить таблицу ну или тоже самое внутри триггера на запись ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 01:27 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_ager, вы какой клиент/язый используете? расчет остатков не единственная операция которая может потребоваться, где у вас будет находится бизнес логика7 какое количество людей будет обслуживать система? используется ли веб доступ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 06:19 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Var79vill_ager, вы какой клиент/язый используете? расчет остатков не единственная операция которая может потребоваться, где у вас будет находится бизнес логика7 какое количество людей будет обслуживать система? используется ли веб доступ? я из далекого прошлого :) - фокспро а там вся логика - в приложении соответственно системы небольшие - до 50 пользователей, до миллиона записей в таблице, никакого веба :) пока работает а тут я самообразованием занимаюсь. Везде читал, что блокировки-зло, без них можно обойтись - вот и пытаюсь разобраться и так пока понимаю - блокировки есть, только скрыты под транзакциями. Удобно. Но можно затеять длинную транзакцию, которая подвесит остальных юзеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 11:33 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
vill_agerНо можно затеять длинную транзакцию, которая подвесит остальных юзеров. разве что только умышленно, имея целью сделать именно это ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2009, 13:05 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Некропост :). Но информация полезна... Демагогию вы конечно развели не шуточную... и все не по делу... Ситуация когда нужна именно блокировка: 1. Первый Пользователь открывает документ и вбивает продажу 2. В этот момент, из желания поглядеть что за продажа, ее же в журнале открывает управляющий или просто другой "продаван" (в общем смысле) пишет комментарий и закрывает - ОК. Версия документа изменена на +1 3. Первый Добил документ и сохраняет его... в момент сохранения проверка... текущая версия +1 а мы пытаемся сохранить - 0... в итоге блок. Ситуация проста и обыденна, но виновник ситуации - пользователь 2 который не должен был попасть в документ с сообщением "Документ редактирует Пользователь 1". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 08:44 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
sql0013. Первый Добил документ и сохраняет его... в момент сохранения проверка... текущая версия +1 а мы пытаемся сохранить - 0... в итоге блок. Ситуация проста и обыденна, но виновник ситуации - пользователь 2 который не должен был попасть в документ с сообщением "Документ редактирует Пользователь 1". Не блок, а сообщение о необходимости повторного ввода. пользователь 2 не знает , что "Документ редактирует Пользователь 1" (может просто смотрит) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 09:23 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Некропост#2 :) 1. Организация работы (гарантированная последовательная обработка) не всегда уместна: есть заказы, накладные и т.п, а есть, например, поток заявок обрабатываемые несколькими независимыми операторами: как проверять, что заявку уже не обрабатывает другой оператор? или документ "статья в базе знаний" - по определению может правиться несколькими сотрудниками. 2. Обновлять только изменившиеся поля - вообще странный подход: в сташном сне вижу, как один пользователь меняет склад-отправитель, а другой клиента :) (пример утрированный, конечшно, но сути не меняет) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 09:30 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
sql001Некропост :). Но информация полезна... Демагогию вы конечно развели не шуточную... и все не по делу... Ситуация когда нужна именно блокировка: 1. Первый Пользователь открывает документ и вбивает продажу 2. В этот момент, из желания поглядеть что за продажа, ее же в журнале открывает управляющий или просто другой "продаван" (в общем смысле) пишет комментарий и закрывает - ОК. Версия документа изменена на +1 3. Первый Добил документ и сохраняет его... в момент сохранения проверка... текущая версия +1 а мы пытаемся сохранить - 0... в итоге блок. Ситуация проста и обыденна, но виновник ситуации - пользователь 2 который не должен был попасть в документ с сообщением "Документ редактирует Пользователь 1". а по делу что-то есть сказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 14:55 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Aleksey Kh.Некропост#2 :) 1. Организация работы (гарантированная последовательная обработка) не всегда уместна: есть заказы, накладные и т.п, а есть, например, поток заявок обрабатываемые несколькими независимыми операторами: как проверять, что заявку уже не обрабатывает другой оператор? или документ "статья в базе знаний" - по определению может правиться несколькими сотрудниками. 2. Обновлять только изменившиеся поля - вообще странный подход: в сташном сне вижу, как один пользователь меняет склад-отправитель, а другой клиента :) (пример утрированный, конечшно, но сути не меняет) 1. Если бардак то конечно не уместна. А "статья в базе знаний" вообще из другой области. 2. На крупных предприятиях много данных и одному человеку это все просто не по силам. Поэтому один человек отвечает за цены в картотеке, к примеру, другой за какие-то качественные характеристики. И нет никакого страшного в том, что каждый из них выполняет свою часть работы по редактированию данных параллельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 15:06 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
iscrafmAleksey Kh.Некропост#2 :) 1. Организация работы (гарантированная последовательная обработка) не всегда уместна: есть заказы, накладные и т.п, а есть, например, поток заявок обрабатываемые несколькими независимыми операторами: как проверять, что заявку уже не обрабатывает другой оператор? или документ "статья в базе знаний" - по определению может правиться несколькими сотрудниками. 2. Обновлять только изменившиеся поля - вообще странный подход: в сташном сне вижу, как один пользователь меняет склад-отправитель, а другой клиента :) (пример утрированный, конечшно, но сути не меняет) 1. Если бардак то конечно не уместна. А "статья в базе знаний" вообще из другой области. 2. На крупных предприятиях много данных и одному человеку это все просто не по силам. Поэтому один человек отвечает за цены в картотеке, к примеру, другой за какие-то качественные характеристики. И нет никакого страшного в том, что каждый из них выполняет свою часть работы по редактированию данных параллельно. 1. А по заявкам что-нибудь скажете? 2. На крупных предприятиях НСИ таже, что и на не очень крупных, ибо процессы те же :) Предлагаю вариант - когда однозначного решения нет - делаем настройку "и пусть бизнес сам разбирается" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2014, 23:38 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Aleksey Kh.iscrafmпропущено... 1. Если бардак то конечно не уместна. А "статья в базе знаний" вообще из другой области. 2. На крупных предприятиях много данных и одному человеку это все просто не по силам. Поэтому один человек отвечает за цены в картотеке, к примеру, другой за какие-то качественные характеристики. И нет никакого страшного в том, что каждый из них выполняет свою часть работы по редактированию данных параллельно. 1. А по заявкам что-нибудь скажете? 2. На крупных предприятиях НСИ таже, что и на не очень крупных, ибо процессы те же :) Предлагаю вариант - когда однозначного решения нет - делаем настройку "и пусть бизнес сам разбирается" :) 1. Я бы придерживался обычного житейского принципа: если не разделяемый ресурс забрали, то другие его просто не видят. Не блокировка, а отчуждение. Если ресурс разделяемый, то принцип живой очереди. 2. Обычно так и делается, у нас по крайней мере. Т.е. для данных параметром указывается разрешено ли их частичное редактирование или записи подлежит весь пакет. В большинстве случаев конечно вариант первый, т.е. если пользователь исправил, к примеру, единицу измерения, то он должен быть уверен что его исправления останутся на месте, если другой пользователь отредактировал "цвет" в этом же экзкмпляре. Но есть случаи (в основном это различные транзакции) когда ответственный за какой-то "класс" должен быть уверен что в базе данных будет то, что он видел целиком, даже если он исправил только один параметр. Тогда просто снимается флажок в конфигурации этого "класса" (у нас SmartUpdate) и действует принцип "кто последний тот и прав", в целом для такого "класса". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 01:03 |
|
Блокировки справочников и документов.
|
|||
---|---|---|---|
#18+
Наверно можно продолжить :) Ну в большинстве систем "живые журналы" (не путать с соц. сетью) уже прошлое. Вероятность что у 2х пользователей будет отркыт не обновленный журнал документов велика. Поэтому необходимо логику блокировки реализовывать. В MSSQL я решил с использованием @@spid - это идентификатор коннекта к БД конкретного пользователя. При запросе объекта из БД он помечается что пользуется в процессе @@spid (int). При освобождении пометка удаляется. Предпочтение @@spid отдано потому, что легко решить такую проблему как аварийный дисконнект при редактировании. В этом случае простой inner join sys.sysprocesses с пометкой о блокировке, поможет понять это рабочая блокировка или ее можно игнорить (ну можно агента заставить удалять каждую минуту все неактуальные блокировки. Тут на любителя). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 07:01 |
|
|
start [/forum/topic.php?fid=33&msg=36350299&tid=1547512]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
2417ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 297ms |
total: | 2819ms |
0 / 0 |