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