Вопрос 6.1. Документ РеализацияТоваров осуществляет движения по регистру ОстаткиНаСкладах, а именно списывает реализованное количество товаров со склада. В обработчике проведения документа выполняется проверка превышения лимитов - минимального допустимого остатка товара на складе и максимально допустимого размера отгрузки со склада. Запрос выглядит следующим образом:
Ответ:
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.КоличествоНаСписание КАК Количество,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
| ИЗ Документ.Реализация.Товары КАК Товары
| ГДЕ Товары.Ссылка = &ДокументСсылка
| СГРУППИРОВАТЬ ПО
| Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОстатков КАК ЛимитыОстатков
| ПО ЛимитыОстатков.Номенклатура=Остатки.Номенклатура И ЛимитыОстатков.Склад = &Склад
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОтгрузкиСоСкладов КАК ЛимитыОтгрузки
| ПО ЛимитыОтгрузки.Номенклатура = Остатки.Номенклатура И ЛимитыОтгрузки.Склад = &Склад
|ПО Остатки.Номенклатура = Товары.Номенклатура
| Товары.Номенклатура КАК Номенклатура,
| Товары.КоличествоНаСписание КАК Количество,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
| ИЗ Документ.Реализация.Товары КАК Товары
| ГДЕ Товары.Ссылка = &ДокументСсылка
| СГРУППИРОВАТЬ ПО
| Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОстатков КАК ЛимитыОстатков
| ПО ЛимитыОстатков.Номенклатура=Остатки.Номенклатура И ЛимитыОстатков.Склад = &Склад
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОтгрузкиСоСкладов КАК ЛимитыОтгрузки
| ПО ЛимитыОтгрузки.Номенклатура = Остатки.Номенклатура И ЛимитыОтгрузки.Склад = &Склад
|ПО Остатки.Номенклатура = Товары.Номенклатура
| ДЛЯ ИЗМЕНЕНИЯ";
1) После ДЛЯ ИЗМЕНЕНИЯ не указаны таблицы. В случае если после предложения ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут данные из всех таблиц, задействованных в запросе. Что приведет к избыточным блокировкам.
Следует блокировать для изменения только таблицу остатков товара.
2) Проверку лимитов нужно делать в самом запросе.
3) Подзапрос следует заменить на ВТ.
Вопрос 6.2. Имеется реально работающая многопользовательская система. Необходимо решить следующие задачи:
1) Определить пользователей, которые в данный момент выполняют длительные запросы к базе данных.
2) Определить пользователей, которые заблокировали других пользователей.
Ответ:
На оба вопроса можно ответить с помощью консоли кластера.
В колонке "захвачено СУБД" отображается время выполнения запроса.
В колонке "заблокировано упр." отображается номер сеанса которым заблокирован текущий сеанс. Номер сеанса можно увидеть и
через монитор активности.
Вопрос 6.3. В метаданных конфигурации описан регистр накопления (остатков) ОстаткиНаСкладах, имеющий измерения "Склад" и "Товар". Информационная база работает в режиме клиент-сервер с использованием СУБД PostgreSQL.
Будут ли перечисленные пары операций выполнятся параллельно из разных сессий? Все операции выполняются при проведении документа.
Параллельность | Операция 1 | Операция 2 |
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телефон»
|
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телевизор»
| |
Чтение с опцией "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» | Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» | |
Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» |
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телефон»
|
Ответ:
Так как используется запрос с опцией "ДЛЯ ИЗМЕНЕНИЯ", то логично сделать вывод о том, что используется автоматический режим управления блокировками. Стоит помнить о том, что в автоматическом режиме для версионных СУБД (коим и является PostgreSQL) минимальным уровнем гранулярности является таблица, поэтому с параллельностью тут дела будут хуже. Важно помнить о том, что в СУБД версионниках S и U блокировки не совместимы.
Поэтому решение будет следующим:
Параллельность | Операция 1 | Операция 2 |
+ |
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телефон»
|
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телевизор»
|
- |
Чтение с опцией "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» | Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» |
- | Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию:
Склад= «Основной»
Товар =«Телефон» |
Запись набора записей со следующими условиями:
Склад= «Основной»
Товар =«Телефон»
|
Комментариев нет:
Отправить комментарий