|
Не работают управляемые блокировки по новой методике проведения | ☑ | ||
---|---|---|---|---|
0
pitbul
02.06.15
✎
10:25
|
Доброго времени суток!
Подскажите почему у меня блокируется вся таблица регистра на чтение, после записи набора. Вываливается ошибка SQL при выполнении запроса на остатки во второй транзакции. Номенклатура разная в документах. Первую транзакцию останавливаю по точке останова на строке Выборка = Результат.Выбрать(); Платформа 8.2.17.169, SQL 2008 R2 Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Товары; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Для Каждого ТекСтр Из Товары Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; //Движение.Склад = ТекСтр.Склад; Движение.Номенклатура = ТекСтр.Номенклатура; Движение.Количество = ТекСтр.Количество; Движение.Сумма = ТекСтр.Сумма; КонецЦикла; //Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; //Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В (&Номенклатура) | ) КАК ОстаткиНоменклатурыОстатки"; //Номенклатура = ; //Запрос.УстановитьПараметр("Склад", Склад); //Запрос.УстановитьПараметр("Ссылка", ссылка); Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая)); Запрос.УстановитьПараметр("Номенклатура", Товары.ВыгрузитьКолонку("Номенклатура")); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.КоличествоОстаток); Если Выборка.КоличествоОстаток < 0 Тогда //Сообщить("Недостаточно номенклатуры " + Выборка.Номенклатура + " Документ не проведен"); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Если Выборка.КоличествоОстаток = 0 Тогда Продолжить; КонецЕсли; КонецЦикла; |
|||
1
MrKartez
02.06.15
✎
10:48
|
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Товары; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Удали |
|||
2
MrKartez
02.06.15
✎
10:48
|
И где у тебя разная номенклатура, когда ты её из одно и той же ТЧ берешь
|
|||
3
pitbul
02.06.15
✎
10:53
|
Удалил, не помогло, но теперь ошибка SQL вываливается и не факт, что на выполнении запроса. До удаления номер строки кода 1С указывалась
Я имею ввиду сами позиции номенклатуры в двух документах разные |
|||
4
MrKartez
02.06.15
✎
11:06
|
Да черт его знает :)
Могу только сказать, что ты блокировку по новой методике не так ставишь //Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; //Движения.ОстаткиНоменклатуры.Записать(); у тебя должна сначала запись идти, а уже только потом накладывается блокировка |
|||
5
H A D G E H O G s
02.06.15
✎
11:09
|
1) Блокировка руками не нужна
2) Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая)); заменить на Запрос.УстановитьПараметр("МоментВремени", ЭтотОбъект.Дата); и попробовать. |
|||
6
MrKartez
02.06.15
✎
11:12
|
(5) Нет, у него именно граница должна быть в параметрах. Иначе движения в минус, которые выполняет этот документ, просто не будет видно.
|
|||
7
H A D G E H O G s
02.06.15
✎
11:14
|
(6) Ты просто попробуй этот вариант и будет ли ошибка.
|
|||
8
H A D G E H O G s
02.06.15
✎
11:15
|
(6) Ай, ты не автор, ошибся. Пусть автор попробует.
|
|||
9
pitbul
02.06.15
✎
11:15
|
Попробовал, ошибка есть. Без изменений
|
|||
10
pitbul
02.06.15
✎
11:15
|
Мож в скуле еще чего настроить надо?
|
|||
11
pitbul
02.06.15
✎
11:16
|
Хотя если сначала читаешь - потом пишешь - все отрабатывает четко
|
|||
12
H A D G E H O G s
02.06.15
✎
11:16
|
(10) Попробуй вообще Дату из запроса убрать, бери оперативные остатки.
|
|||
13
pitbul
02.06.15
✎
11:18
|
(12) не помогло
|
|||
14
Легат
02.06.15
✎
11:21
|
Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Записать();
Их можно друг за другом ? .. |
|||
15
pitbul
02.06.15
✎
11:22
|
(14) Почему нет?
|
|||
16
Fragster
гуру
02.06.15
✎
11:23
|
если вываливается ошибка _SQL_, значит управляемые блокировки не используются, есличо
|
|||
17
Зеленый пень
02.06.15
✎
11:24
|
(0) В свойствах конфигурации какой Режим управления блокировкой выбран?
|
|||
18
pitbul
02.06.15
✎
11:25
|
(16) и куда копать, подскажешь?
|
|||
19
СРКД
02.06.15
✎
11:25
|
Управляемые блокировки что это можете вкратце описать?)
|
|||
20
pitbul
02.06.15
✎
11:25
|
(17) управляемый
|
|||
21
Легат
02.06.15
✎
11:27
|
||||
22
alexlap
02.06.15
✎
11:27
|
А структура регистра какая? Индекс по номенклатуре есть?
Живой? Строк в табилчной части много? |
|||
23
pitbul
02.06.15
✎
11:29
|
(22) структура Измерение номенклатура, р-сы Сумма, количество
Индекс есть. строк в самой ТЧ у одного дока 1, у другого 16 На сайте ИТС нашел, что если записей в регистре мало, то блокируется весь регистр - сделал записей более 10000 Что значит живой? |
|||
24
H A D G E H O G s
02.06.15
✎
11:47
|
"сделал записей более 10000 "
И? |
|||
25
pitbul
02.06.15
✎
11:48
|
(24) Без изменений
|
|||
26
H A D G E H O G s
02.06.15
✎
11:49
|
(25) Давай подключусь, гляну
|
|||
27
pitbul
02.06.15
✎
11:55
|
(26) может лучше dt-шник выложу, а то на работе.
|
|||
28
alexlap
02.06.15
✎
11:57
|
(23) Живой значит может использоваться. Не отключен например.
А где записи то сделал 10 000? Надо в таблице остатков. |
|||
29
pitbul
02.06.15
✎
12:00
|
(28) тоже подумал об этом. Щас создам номенклатуры много позиций
|
|||
30
pitbul
02.06.15
✎
12:00
|
(28) и как проверить индекс, что он используется?
|
|||
31
H A D G E H O G s
02.06.15
✎
12:03
|
(30) ms sql profiler
|
|||
32
H A D G E H O G s
02.06.15
✎
12:03
|
(27) выкладывай
|
|||
33
ssh2006
02.06.15
✎
12:37
|
(0) Чтобы не ставить ручную блокировку нужно раскомментировать
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; |
|||
34
ssh2006
02.06.15
✎
12:50
|
Видимо при чтении во второй транзакции запрос "цепляет" незафиксированные данные первой и выскакивает в тайм аут ожидания. А на уровне менеджера блокировок 1С все нормально - номенклатура разная.
|
|||
35
pitbul
02.06.15
✎
12:51
|
В общем, создал остатков больше 10000 записей и все стало отрабатывать четко.
Всем большое спасибо за оказанную помощь. Очень оперативно) |
|||
36
pitbul
02.06.15
✎
12:52
|
(33) да точно, если нужно блокировать записи
|
|||
37
ssh2006
02.06.15
✎
12:55
|
(36) Блокируются они автоматически в момент записи в любом случае . Только нужно отключить разделитель итогов, чтобы блокировка была без его учета, что и делает БлокироватьДляИзменения
|
|||
38
H A D G E H O G s
02.06.15
✎
12:57
|
(34) Индексный скан из за малого числа записей. Вот и все.
|
|||
39
Fragster
гуру
02.06.15
✎
12:58
|
(38) включи ему read committed snapshot
|
|||
40
ssh2006
02.06.15
✎
13:37
|
(39) кстати, да, на 8.3 такой ситуации бы не возникло
|
|||
41
Fragster
гуру
02.06.15
✎
13:38
|
(40) можно и на 8.2 включить. только после реструктуризации иногда перевключать пришлось бы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |