|
Теоретический вопрос по взаимоблокировкам | ☑ | ||
---|---|---|---|---|
0
noxxx
05.11.13
✎
12:50
|
Есть проблема, господа. Нужна помощь зала.
УПП. Есть документ "Заказ покупателя". При проведении документа "Заказ покупателя" делается запрос к регистру "Заказы покупателей", т.е. к самому регистру по которому делает движения документ. Часто происходит так, что на выполнении запроса к регистру происходит взаимоблокировка с другим пользователем, проводящим заказ покупателя. Как этой проблемы избежать? Режим управления блокировкой данных в конфигурации - управляемый. У документа - автоматический. Не нужно ли где-нибудь явно блокировку наложить на регистры? |
|||
1
GROOVY
05.11.13
✎
12:54
|
"в конфигурации - управляемый. У документа - автоматический" - значит и у документа автоматический.
|
|||
2
noxxx
05.11.13
✎
12:59
|
(1) А откуда оно понимает что блокировать, а что - нет? Я так понимаю что оно что-то недоблокирует.
|
|||
3
AaNnDdRrEeYy
05.11.13
✎
13:00
|
бестолку что то накладывать пока режим автоматический, все равно 1с проигнорирует.
|
|||
4
noxxx
05.11.13
✎
13:01
|
(3) Так а делать-то тогда что? Если запрос убрать, то всё заработает нормально. Надо что б и запрос остался, и взаимоблокировок что б не было.
|
|||
5
AaNnDdRrEeYy
05.11.13
✎
13:07
|
(4) хитрый какой, это основная головная боль за которую денег много дают, учись.
|
|||
6
zladenuw
05.11.13
✎
13:07
|
Функция ВыполнитьБлокировку()
Результат = Ложь; //Управляемые блокиорвки Блокировка = Новый БлокировкаДанных; //блокировка Движения по регистрам КоллекцияДвижений = ЭтотОбъект.Метаданные().Движения; Для каждого СтрокаДвижений Из КоллекцияДвижений Цикл ИмяРегистра = СтрокаДвижений.Имя; ТипРегистра = ""; Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра)<>Неопределено Тогда ТипРегистра = "РегистрНакопления"; Иначе ТипРегистра = "РегистрСведений"; КонецЕсли; Если ТипРегистра<>"" Тогда ЭлементБлокировки = Блокировка.Добавить(ТипРегистра+"."+ИмяРегистра+".НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор",Ссылка); КонецЕсли; КонецЦикла; Попытка Блокировка.Заблокировать(); Исключение Результат = Истина; //Сообщить("Попробуйте еще раз!!!"); КонецПопытки; Возврат Результат; КонецФункции // ВыполнитьБлокировку() в проведение пишешь Отказ = ВыполнитьБлокировку() |
|||
7
zladenuw
05.11.13
✎
13:08
|
(6) и для документа ставишь блокировка управляемая. но надо найти где еще используешь этот документ. хотя тебе платформа сама скажет о ошибке
|
|||
8
AaNnDdRrEeYy
05.11.13
✎
13:12
|
(6) это блокировка записей в которых Регистратор = проводимый документ, ему не это надо. скорее блокировку по данным в таб части надо сделать
Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах"); ЭлементБлокировки.УстановитьЗначение("Качество", Справочники.Качество.НайтиПоКоду("1")); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); Блокировка.Заблокировать(); |
|||
9
noxxx
05.11.13
✎
13:13
|
(5) Так мне готовое решение не нужно, мне только направление :)
Правильно ли я понимаю, что автоматическая блокировка чего-то "недопонимает"? |
|||
10
AaNnDdRrEeYy
05.11.13
✎
13:13
|
+(8) и да, ты не сказал база то файлавая или sql?
|
|||
11
noxxx
05.11.13
✎
13:13
|
(10) SQL
|
|||
12
AaNnDdRrEeYy
05.11.13
✎
13:15
|
(9)блокировка возникает если что то лишнее заблокировано, если не заблокировано ничего лишнего а просто два человека пытаются провести два разных документа которые списывают два одинаковых товара и само проведение длятся более 20 секунд (кажется такое время по умолчанию для ожидания освобождения блокировки) то тут уж ничего не поделать. остается только смотреть что именно блокируется и почему на такое долгое время.
|
|||
13
AaNnDdRrEeYy
05.11.13
✎
13:19
|
+(9) пользователи один тип документа провести не могут или это разные типы документов? например (1 полз - заказ покупателя, 2 - польз Реализация)
|
|||
14
Мебиус
05.11.13
✎
13:20
|
(12)
неправильно |
|||
15
Мебиус
05.11.13
✎
13:25
|
(0)
конфликт блокировок возникает в том случае когда в начале транзакции накладывается разделяемая блокировка, затем исключительная - для записи. Когда одновременно проводятся два подобных документа, они накладывают разделяемую блокировку на одни и те же записи, а затем пытаются записать данные (исключительная блокировка). В этот момент возникает конфликт блокировок. |
|||
16
AaNnDdRrEeYy
05.11.13
✎
13:26
|
(15) тогда пусть "ДЛя изменения" в запрос добавит.
|
|||
17
Мебиус
05.11.13
✎
13:27
|
Самый простой способ, переводить документ в режим управляемых блокировок и накладывать исключительную блокировку на считываемые в транзакции записи
|
|||
18
Рыжий Лис
05.11.13
✎
14:03
|
(1) Во всех типовых так - на конфигурации управляемый, на документах и регистрах автоматический, и 1С заявляет что все в управляемом.
|
|||
19
Мебиус
05.11.13
✎
14:04
|
(18)
ну да, если у конфигурации в целом режим управляемый то все равно, что у документа установлено |
|||
20
noxxx
05.11.13
✎
14:17
|
(19) Так я не понял. Что приоритетнее - то что у конфигурации или то что у документа?
|
|||
21
Zerga
05.11.13
✎
15:39
|
При выборе значений Автоматический или Управляемый режим блокировок при чтении или записи данных любого объекта конфигурации будет определяться именно этим выбранным значением.
Например, если установлен режим Автоматический, то при записи, скажем, любого элемента справочника, будут использоваться автоматические блокировки, устанавливаемые СУБД. Собственнный менеджер блокировок задействован не будет. Поведение системы будет полностью аналогичным поведению версии 8.0. Если же установлен режим Управляемый, то, независимо от того, какие режимы управления блокировками установлены для конкретных объектов конфигурации (об этом смотри далее), при записи, скажем, документа система всегда будет самостоятельно устанавливать необходимые управляемые блокировки, которые будут обрабатываться собственным менеджером транзакционных блокировок. Этот режим предназначен для работы всей конфигурации только с управляемыми блокировками в транзакции. Если же для свойства конфигурации выбран режим Автоматический и управляемый, то для конкретного объекта конфигурации режим блокировки будет определяться значением свойства Режим управления блокировкой данных самого объекта конфигурации (рис. 18). |
|||
22
Zerga
05.11.13
✎
15:40
|
А по исходному вопросу ЦУП в помощь или Гилев со скайнетом.
|
|||
23
noxxx
06.11.13
✎
10:08
|
(16) "Для изменения" в запросе проблему не решило :(
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |